proc меняет класс в irb - PullRequest
       10

proc меняет класс в irb

2 голосов
/ 15 июля 2011

Как раз тогда, когда я думал, что у меня голова обернута вокруг проков и лямбд, это происходит ...

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 меняет свой класс при вызове?

Что янедопонимание и / или неправильное поступление здесь?

1 Ответ

3 голосов
/ 15 июля 2011

Во-первых, в вашем коде есть синтаксическая ошибка, поэтому я предполагаю, что вы имеете в виду x = Proc.new {|name| "Hello #{name}"} вместо x = Proc.new (|name| "Hello #{name}"}.

Во-вторых, когда я запускаю ваш пример кода, я не получаютакое поведение.

Однако, если переменная name должна быть названа так же, как имя переменной, в которой вы храните proc (x в вашем примере), и вы использовали версию ruby ​​до 1.9, выполучит это поведение.

Вот пример этого (я использую 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 это поведение называется теневым и описывается здесь .

...