正当我以为我已经全神贯注于 procs 和 lambda 时,却发生了这种情况......
irb> x = Proc.new{|name| "Hello #{name}"}
irb> x.class #=> Proc
irb> x.call("Bob") #=> "Hello Bob"
irb> x.class #=> String
irb> x #=> "Bob"
为什么x
在调用时改变它的类?
我在这里误解和/或做错了什么?
最佳答案
首先,您的代码中存在语法错误,因此我假设您的意思是 x = Proc.new {|name| "Hello #{name}"}
而不是 x = Proc.new (|name| "Hello #{name}"}
。
其次,当我运行您的示例代码时,我没有得到这种行为。
但是,如果 name
变量的命名与存储 proc 的变量名称相同(在示例中为 x
),并且您使用的是1.9 之前的 ruby 版本,您将会遇到此行为。
这是一个示例(我使用 x
作为 block 变量的名称,这是 ruby 1.8.7):
>> x = Proc.new {|x| "Hello #{x}"}
=> #<Proc:0x00000001013335b8@(irb):1>
>> x.class
=> Proc
>> x.call("Bob")
=> "Hello Bob"
>> x.class
=> String
>> x
=> "Bob"
发生这种情况的原因是因为您可以覆盖 ruby pre 1.9 中当前作用域之外定义的变量。在 ruby 1.9 中,这种行为称为遮蔽,并在 here 中进行了描述。 .
关于ruby - proc 在 irb 中改变类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6707628/