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