【问题标题】:How to check if a variable exists with a value without "undefined local variable or method"?如何检查一个变量是否存在一个没有“未定义的局部变量或方法”的值?
【发布时间】:2012-08-20 01:36:46
【问题描述】:

这是一种常见模式:如果变量不存在,我会收到 undefined local variable or method 错误。

现有代码有if variable_name.present?,但这并没有说明变量不存在。

如何检查变量的值并说明它根本不存在?

我试过了:

if (defined? mmm) then
  if mmm.present? then
    puts "true"
  end
end

但 Ruby 仍会检查内部 mmm.present? 并在它不存在时抛出“no such variable”。

我确信有一个共同的模式/解决方案。

【问题讨论】:

  • 有谁知道是否有类似.presence 的函数,它检查变量是否为nil,如果不是,它将输出该值。除了在这种情况下,它会检查变量是否为 defined??
  • 看来这已经不是真的了!

标签: ruby-on-rails ruby variables undefined exists


【解决方案1】:

present? 更改为 != '' 并使用 && 运算符,该运算符仅在第一个表达式为真时尝试评估第二个表达式:

if defined?(mmm) && (mmm != '') then puts "yes" end

但实际上从 2019 年开始,这不再需要,因为以下两项都有效

irb(main):001:0> if (defined? mm) then
irb(main):002:1* if mm.present? then
irb(main):003:2* p true
irb(main):004:2> end
irb(main):005:1> end
=> nil
irb(main):006:0> if (defined? mm) then
irb(main):007:1* p mm
irb(main):008:1> end
=> nil

【讨论】:

  • 还要注意运算符的偏好并适当地使用括号,在这种情况下,表达式的第二部分包括括号,但是如果您检查的是 boolean 而您没有对defined?(mmm) 使用括号,条件将返回true。因此,在进行复杂比较时,最好使用(defined?(mmm))
【解决方案2】:

Ruby on Rails

if defined?(mm) && mm.present?
  puts "acceptable variable"
end

在 IRB 上

if defined?(mm) && !mm.blank? && !mm.nil?
  puts "acceptable variable"
end

它可以确保你不会得到未定义的变量或 nil 或空值。

了解defined? 的工作原理

a = 1
defined?(a) # => "local-variable"

b = nil
defined?(b) # => "local-variable"

c = ""
defined?(c) # => "local-variable"

d = []
defined?(d) # => "local-variable"

$e = 'text'
defined?($e) # => "global-variable"

defined?(f) # => nil
defined?($g) # => nil

请注意,defined? 在它所在的范围内检查变量。

为什么需要defined?

当可能存在未定义的变量时,您不能只使用.nil? 进行检查,您将有机会得到 NameError。

a = nil
a.nil? # => true
b.nil? # => NameError: undefined local variable or method `b'

【讨论】:

  • 不流利使用 Ruby,但在接受答案 3 年后,您能否提供一些关于它与现有答案的关系的信息?在这里,我建议稍微解释一下.nil?addition,这可能是保留then并考虑到不存在的魔力。但你肯定会更清楚。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-26
  • 1970-01-01
  • 2018-04-19
  • 2015-01-01
相关资源
最近更新 更多