我期待以下代码段:
var2 = "Not Empty" unless defined? var2
返回" Not Empty",但我没有。对此为何发生的任何见解?
答案 0 :(得分:2)
defined?
方法将返回:
nil =>表达无法辨认
上述代码段中的问题是局部变量的范围。 Its end on the line where you using it
。要了解有关本地变量的更多信息,请查看:local_variable
pry(main)> p "local_var is not initialized" unless defined? local_var
=> "loca_var is not initialized"
但如果你这样做:
pry(main)> local_var = "initialized" unless defined? local_var
=> nil
local_var仍为nil
,因为它的作用域在该行之后结束,因此分配的任何内容都被浪费了。
解决方案:我会建议您是否需要此行为,然后使用此行为:
local_var ||= "initialized"
答案 1 :(得分:0)
如果您尝试确定变量是否为var2 = "Not Empty" if var2.nil?
,请尝试nil
。 defined?
更少用于不同目的(见下文)。
irb(main):009:0> var2 = nil
=> nil
irb(main):010:0> var2 = "Not Empty" if var2.nil?
=> "Not Empty"
irb(main):011:0> var2
=> "Not Empty"
irb(main):012:0> var2 = 'foo'
=> "foo"
irb(main):013:0> var2 = "Not Empty" if var2.nil?
=> nil
irb(main):014:0> var2
=> "foo"
如果您不确定变量是否已声明,则可以使用以下语法:
if defined?(var2).nil?
var2 = "Not Empty"
end
(正如@Jordan所指出的那样,由于某种奇怪的原因,并没有全部在一条线上工作,但是这很有效。)
然而,一般来说,习惯性的Ruby方式称为" nil guard"看起来如下:
var2 ||= "Not Empty"