18

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

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

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

我试过了:

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

但是 Ruby 仍然会检查内部mmm.present?并在它不存在时抛出“没有这样的变量”。

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

4

2 回答 2

28

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

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
于 2012-08-24T13:27:52.520 回答
4

关于 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'
于 2016-06-05T06:47:29.950 回答