Ruby on rails 如何检查是否存在一个值不带“quot”的变量;未定义的局部变量或方法“;?

Ruby on rails 如何检查是否存在一个值不带“quot”的变量;未定义的局部变量或方法“;?,ruby-on-rails,ruby,variables,undefined,exists,Ruby On Rails,Ruby,Variables,Undefined,Exists,这是一种常见的模式:如果变量不存在,我会得到一个未定义的局部变量或方法错误 现有代码具有if variable\u name.present?,但这并不说明变量不存在 我如何检查变量的值,并解释它根本不存在 我试过: if (defined? mmm) then if mmm.present? then puts "true" end end 但是Ruby仍然检查内部mmm.present?,并在不存在时抛出“no-some-variable” 我相信这有一个共同的模式/解决方

这是一种常见的模式:如果变量不存在,我会得到一个
未定义的局部变量或方法
错误

现有代码具有
if variable\u name.present?
,但这并不说明变量不存在

我如何检查变量的值,并解释它根本不存在

我试过:

if (defined? mmm) then
  if mmm.present? then
    puts "true"
  end
end
但是Ruby仍然检查内部
mmm.present?
,并在不存在时抛出“no-some-variable”


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

当前?
更改为
!=''
并使用&&运算符,该运算符仅在第一个表达式为true时尝试计算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
关于RubyonRails

如果定义?(mm)和&mm.存在?
放入“可接受变量”
结束
论内部评级

如果定义?(mm)和&!mm.blank?&!没有?
放入“可接受变量”
结束
它可以确保您不会得到未定义的变量或nil或空值

了解
是如何定义的?
工作的

a=1
已定义?(a)#=>“局部变量”
b=零
已定义?(b)#=>“局部变量”
c=“”
已定义?(c)#=>“局部变量”
d=[]
已定义?(d)#=>“局部变量”
$e='text'
已定义?($e)#=>“全局变量”
已定义?(f)#=>nil
定义?($g)#=>零
请注意,
已定义?
检查变量所在范围内的变量

为什么需要定义

当可能存在未定义的变量时,您不能仅使用
.nil?
检查它。例如,您将有机会获得NameError

a=nil
a、 无?#=>真的
b、 无?#=>NameError:未定义的局部变量或方法“b”

Ruby不太流利,但在获得公认答案3年后,您能否提供一些关于它与现有答案之间关系的信息?在这里,我建议解释一下
.nil?
加法,这可能是一种神奇的方法,可以节省
然后
,并考虑到不存在。但你肯定会更清楚。谢谢。还要注意操作符的首选项并适当地使用括号,在这种情况下,表达式的第二部分包括括号,但是如果您正在检查布尔值,并且未对定义的
(mmm)
使用括号,则条件将返回
true
。因此,在复杂比较中使用
(defined?(mmm))
是一种很好的做法。有人知道是否有类似的函数,如
.presence
,它检查变量是否为
nil
,如果不是,它将输出值。除非在这种情况下,它会检查变量是否定义了
?似乎这不再是真的!