如何在没有“未定义的局部变量或方法”的情况下检查变量是否存在?

时间:2012-08-24 13:21:41

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

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

现有代码有if variable_name.present?,但这并未考虑不存在的变量。

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

我试过了:

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

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

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

2 个答案:

答案 0 :(得分:24)

present?更改为!= ''并使用&&如果第一个表达式为真,则仅尝试评估seond表达式的运算符:

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

答案 1 :(得分:1)

尝试:

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

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

你可以只使用定义?检测expired-session-hash,特别是深层哈希。

if defined?(session[:user]['name'])
  puts "active session"
else
  puts "expired session"
end