Ruby:方法莫名其妙地被覆盖并设置为nil

bme*_*ere 7 ruby local-variables

如果我执行这个ruby代码:

def foo
  100
end

p defined?(foo), foo
if false
  foo = 200
end
p defined?(foo), foo
Run Code Online (Sandbox Code Playgroud)

我得到的输出是:

"method"
100
"local-variable"
nil
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释为什么foo设置为nil不执行if后?这是预期的行为还是红宝石?

Mic*_*ohl 5

nil即使无法像在if false案例中那样到达代码,分配左侧的名称也会设置为.

>> foo
NameError: undefined local variable or method `foo' for main:Object
...
>> if false
..   foo = 1
..   end #=> nil
>> foo #=> nil
Run Code Online (Sandbox Code Playgroud)

当Ruby尝试解析裸字时,它首先查找局部变量(在Pickaxe书中有一个引用,我现在似乎无法找到).既然你现在有一个叫它foo显示nil.正如Mischa所说,该方法仍然可以称为foo().

  • 只要变量位于赋值的左侧,是的.顺便说一句:既然你是SO的新手,那么这里的礼仪就是赞成和/或接受有用的答案.如果您还有其他问题,我很乐意更新我的答案. (2认同)