ruby - proc 在 irb 中改变类

标签 ruby irb proc-object

正当我以为我已经全神贯注于 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/

相关文章:

ruby-on-rails - 我们是否将 else 与 unless 语句一起使用?

ruby - 如何在在线 irb 中测试 Digest::SHA2.hexdigest?

ruby - 为什么 Ruby 输出 [[ :rest]] when the parameter method is called on String objects?

Ruby:Proc.new { 'waffles' } 与 proc { 'waffles' }

ruby - 有没有办法避免在 'elsif' 分支中多次调用函数?

ruby - 如何按照它们在字符串 y 中出现的顺序对字符串 x 进行排序?

ruby - sinatra :public is not returning a path as expected. 中的错误或功能?

mysql - ActiveRecord::ConnectionNotEstablished(未找到 'primary' 的连接池。)没有 Rails

Ruby:将 proc 转换为 lambda?

ruby - 我们如何在不同的 Ruby 类之间复制单例方法?