【问题标题】:proc changing class in irbirb中的proc更改类
【发布时间】:2011-07-15 13:21:56
【问题描述】:

就在我认为我的头被 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 在调用时会改变它的类?

我在这里误解和/或做错了什么?

【问题讨论】:

  • 您使用的是哪个 ruby​​ 版本?它在 1.9.2ree 上按预期工作

标签: ruby irb proc-object


【解决方案1】:

首先,您的代码中存在语法错误,所以我假设您的意思是 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 中,这种行为称为阴影,描述为 here

【讨论】:

  • 宾果游戏!谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多