irb中的进程更改类



就在我以为自己沉浸在进程之中的时候;

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变量命名为与存储过程的变量名称相同(在您的示例中为x),并且您使用的是1.9之前的ruby版本,则会得到此行为。

这里有一个例子(我使用x作为块变量的名称,这是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中,这种行为被称为阴影,在这里描述。

最新更新