为什么以下代码不会抛出错误?
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 也会发生同样的事情.
在Ruby 1.8.7和1.9.2中也是如此:
$ irb
ruby-1.8.7-p302 > foo.nil?
NameError: undefined local variable or method `foo' for #<Object:0x3794c>
from (irb):1
ruby-1.8.7-p302 > @bar.nil?
=> true
ruby-1.8.7-p302 > @@wah.nil?
NameError: uninitialized class variable @@wah in Object
from (irb):3
Run Code Online (Sandbox Code Playgroud)
为什么实例变量的处理方式与本地和类变量不同?
考虑以下两个ruby代码片段.
puts "One"
if false
d = 1
end
puts "Two"
puts d
puts "Three"
Run Code Online (Sandbox Code Playgroud)
这将打印以下内容
One
Two
Three
Run Code Online (Sandbox Code Playgroud)
现在,请考虑以下内容
[].each do |i|
flag = false
end
puts "Two"
puts flag
puts "Three"
Run Code Online (Sandbox Code Playgroud)
这给出了以下内容
Two
'<main>': undefined local variable or method 'flag' for main:Object (NameError)
Run Code Online (Sandbox Code Playgroud)
为什么在第一种情况下打印空白而第二种情况会抛出错误?
谢谢
有人可以检查一下我注意到的这种行为吗?
如果您没有为局部变量分配任何内容并尝试将其打印出来,则会按预期生成异常.如果在无法访问的代码路径中分配局部变量,则它可以正常工作.应该是这样的吗?
def a
# Should generate an error because foobar is not defined.
puts foobar
end
def b
# This block never is run but foobar is entered into the symbol table.
if false
foobar = 123
end
# This succeeds in printing nil
puts foobar
end
begin; a; rescue Exception => e; puts "ERROR: #{e.message}"; end
begin; b; rescue Exception => e; puts "ERROR: #{e.message}"; end
Run Code Online (Sandbox Code Playgroud) 我正在玩if积木中的任务操作,并发现了以下结果,这让我感到惊讶:
C:\>irb --simple-prompt
if false
x = 10
end
#=> nil
p x
nil
x.object_id
#=> 4
#=> nil
p y
NameError: undefined local variable or method `y' for main:Object
from (irb):5
from C:/Ruby193/bin/irb:12:in `<main>'
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,您可以看到x已创建局部变量,即使它仅被分配给falsy if块.我想看到的内容x与p x这迫使我相信,分配却没有这样做,而是x变量存在.x.object_id也证明了这种情况.
现在我的问题是如何x创建局部变量,即使if块入口点是故意关闭的?
我期望输出p x类似于输出p y.但相反,我得到了一个惊人的答案p x.
有人可以向我解释这个概念是如何运作的吗?
编辑
不,这是另一个测试.仅local变量不是这种情况.同样的事情instance和class变量也发生了.见下文:
class Foo
def show
@X …Run Code Online (Sandbox Code Playgroud)