即使在Ruby中IF条件求值为false时,如何创建局部变量?

Zac*_* Xu 7 ruby variables

在irb中尝试以下内容:(我使用的是Ruby 2.0.0-p247)

blah
#=> NameError: undefined local variable or method `blah' for main:Object

if false
  blah = 'blah'
end
#=> nil 

blah
#=> nil
Run Code Online (Sandbox Code Playgroud)

我很惊讶,blah分配nil甚至当if条件计算为false.我认为在if条件评估时跳过了代码false.

有Ruby内部知识的人可以解释一下这是怎么发生的吗?

谢谢

Ser*_*sev 9

ruby中的局部变量是在解析/编译代码(非执行)期间创建的.它们是词法范围的,因此局部变量在分配给它的行之前是不可见的.

defined?(foo) # => nil
if false
  defined?(foo) # => 
  foo = 'blah'
  defined?(foo) # => 
end

defined?(foo) # => "local-variable"
foo # => nil
Run Code Online (Sandbox Code Playgroud)

defined?(foo)里面的线条if什么都没有,因为它们没有运行.分配也没有执行.但是,编译器看到了对局部变量的赋值并创建了一个(默认值为nil).

这种行为解释了WAT谈话的诀窍:

a = a # => nil
Run Code Online (Sandbox Code Playgroud)

即使变量a不存在,也会在此行之前创建(并设置为nil),因为代码中存在赋值表达式(其目标是未知的局部变量).因此,当评估此表达式的右侧时,a存在.

  • @Pak:你去http://pastebin.com/HvNy4u69 (3认同)