2014-01-29 64 views
10

我在Arch Linux上使用此版本的Ruby。我也嘗試了Ruby 1.9中的第一個代碼片段,它有相同的結果。具有塊本地參數的多個內核#local_variables條目

ruby -v 
ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-linux] 

uname -a 
Linux ryantm0j132 3.12.7-2-ARCH #1 SMP PREEMPT Sun Jan 12 13:09:09 CET 2014 x86_64 GNU/Linux 

下面這三個片段是單獨的程序。

當我使用塊局部變量陰影可變的local_variables數組包含3項:

a = 1 
puts local_variables.inspect #=> [:a] 
proc { |;a| 
    puts local_variables.inspect #=> [:a,:a,:a] 
}.call 

如果我不影,任何它包含1項:

puts local_variables.inspect #=> [] 
proc { |;b| 
    puts local_variables.inspect #=> [:b] 
}.call 

又如塊的局部變量不會遮蔽任何東西:

a = 1 
puts local_variables.inspect #=> [:a] 
proc { |;b| 
    puts local_variables.inspect #=> [:b,:a] 
}.call 

是t第一種情況下這些額外條目的原因是什麼?這是紅寶石的bug嗎?

+0

嗯''''在'|; a |'中做什麼? – mhutter

+0

@Manuel它將參數分隔爲lambda和局部變量。 – mudasobwa

+1

我在這裏報告了這個錯誤https://bugs.ruby-lang.org/issues/9486 – ryantm

回答

1

它看起來像我終於明白了爲什麼有三個。這是我的能力來決定這是否是一個錯誤。

讓我們來看看bindings

b1 = binding 
a = 1 
puts proc { |b2=binding; a| 
    a = 3 
    "T: #{b1}, B: #{b2}, L: #{binding}\n" + 
    "TV: #{b1.eval('a')}, BV: #{b2.eval('a')}, LV: #{binding.eval('a')}" 
}.call 
# ⇒ T: #<Binding:0x0000000294ef88>, 
# ⇒ B: #<Binding:0x0000000294de58>, 
# ⇒ L: #<Binding:0x0000000294dd68> 
# ⇒ T: 1, B: 3, L: 3 

,似乎有三個Binding對象,每個都具有本地變量名稱添加到列表中當且僅有人陰影。綁定b2,雖然它是一個單獨的實例,但受到a = 3設置的影響。

可能是爲了簡化local_variables折扣。

+0

如果我在相同的上下文級別連續調用兩次'binding',它會產生兩個單獨的對象。 – ryantm