Ruby irb中的进程更改类

Ruby irb中的进程更改类,ruby,irb,proc-object,Ruby,Irb,Proc Object,就在我以为我的头被procs&lambdas缠住的时候,这发生了 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在调用时更改其类 我在这里误解了什么和/或做错了什么?首先,您的代码中有一个语法错误,因此

就在我以为我的头被procs&lambdas缠住的时候,这发生了

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
作为块变量的名称,这是ruby 1.8.7):

>x=Proc.new{x}“你好{x}”
=> #
>>x级
=>程序
>>x.呼叫(“鲍勃”)
=>“你好,鲍勃”
>>x级
=>字符串
>>x
=>“鲍勃”

发生这种情况的原因是,您可以覆盖ruby pre 1.9中当前作用域之外定义的变量。在ruby 1.9中,这种行为称为阴影,并已进行了描述。

您使用的ruby版本是什么?它在
1.9.2
ree
宾果游戏中都能正常工作!谢谢。
>> x = Proc.new {|x| "Hello #{x}"}
=> #<Proc:0x00000001013335b8@(irb):1>
>> x.class
=> Proc
>> x.call("Bob")
=> "Hello Bob"
>> x.class
=> String
>> x
=> "Bob"