def foo
#bar = nil
if true
bar = 1
else
bar = 2
end
bar #<-- shouldn't this refer to nil since the bar from the if statement is removed from the stack?
end
puts foo # prints "1"
Run Code Online (Sandbox Code Playgroud)
我一直认为你必须创建一个临时变量并将其定义为nil或初始值,以便在if/else语句中定义的变量将保持在if/else语句的范围之外而不会从堆栈中消失?为什么打印1而不是零?
为什么以下代码不会抛出错误?
if false
x = 0
end
x #=> nil
Run Code Online (Sandbox Code Playgroud)
以下确实会引发错误:
y # NameError: undefined local variable or method `y' for main:Object
Run Code Online (Sandbox Code Playgroud)
unless&casestatements 也会发生同样的事情.
从刚刚启动的会话中考虑以下irb片段:
irb:01> baz # => NameError, baz is not defined
irb:02> baz || baz = 0 # => NameError, baz is not defined
irb:03> baz # => nil
Run Code Online (Sandbox Code Playgroud)
baz是一个未定义的变量,试图评估它产生了一个NameError.然而,不知何故,在这个操作之后,baz被定义了,并且具有值nil.看起来,即使没有人(明确地)要求它,也将值nil赋给变量baz.是否存在潜在的语言原因,为什么这种行为是可取的?
解释此行为和其他类似混淆构造的规则是什么,例如:
irb:04> true if foo # => NameError
irb:05> foo # => NameError; name still undefined
irb:06> foo = (true if foo) # => nil
irb:07> foo # => nil; name defined as nil
irb:08> true || i = 0 …Run Code Online (Sandbox Code Playgroud) 我想知道,为什么a可见?
if true
puts 'true'
else
puts 'false'
a = 123
end
puts a # no error
# or
# my_hash = {key: a}
# puts my_hash # :key => nil
Run Code Online (Sandbox Code Playgroud)
但这会导致错误,即使显示"真实"
if true
puts 'true'
else
puts 'false'
a = 123
end
puts a2 # boooooom
Run Code Online (Sandbox Code Playgroud) 下面的Ruby代码会导致x被"定义"(即defined(x)返回"local-variable"哪怕是这个代码的执行之前,而且即使不进行分配未定义:
如果为假,则x = 1
具体来说,x局部变量将设置为nil.对于从未执行过的赋值while false和until false子句的赋值,行为类似.您可以在irb中运行或在某些代码片段上运行ruby来验证这一点.
我的问题是双重的: