2013-05-25 15 views
13

zmienne lokalne zdefiniowane poza wątku wydają się być widoczne od wewnątrz tak, że dwa kolejne zastosowania Thread.new wydają się być takie same:Kiedy trzeba przekazać argumenty do `Thread.new`?

a = :foo 
Thread.new{puts a} # => :foo 
Thread.new(a){|a| puts a} # => :foo 

document podaje przykład:

arr = [] 
a, b, c = 1, 2, 3 
Thread.new(a,b,c){|d, e, f| arr << d << e << f}.join 
arr #=> [1, 2, 3] 

ale od a, b, są widoczne od wewnątrz utworzonego wątku, to powinno być również takie samo jak:

arr = [] 
a, b, c = 1, 2, 3 
Thread.new{d, e, f = a, b, c; arr << d << e << f}.join 
arr #=> [1, 2, 3] 

Czy są jakieś różnice? Kiedy należy przekazywać zmienne lokalne jako argumenty do Thread.new?

Odpowiedz

15

Kiedy przekazać zmienną do wątku takiego, wtedy gwint sprawia lokalną kopię zmiennej i używa go, więc do niej modyfikacji nie wpływają na zmienną poza wątku została przekazana w

a = "foo" 
Thread.new{ a = "new"} 
p a # => "new" 
Thread.new(a){|d| d = "old"} 
p a # => "new" 
p d # => undefined 
+0

Dobra odpowiedź. Do momentu. – sawa

+0

Jeśli mamy wartość nadpisującą 'd' wewnątrz wątku, to jaki jest przypadek użycia, aby przekazać go jako argument? A jeśli wykonujemy jakąkolwiek operację na 'd', to odzwierciedla ona wartość' a'. '' ' a =" foo " Thread.new {a =" new "} p a Thread.new (a) do | d | d.prepend ("old") stawia d # => "oldnew" stawia # => "oldnew" koniec '' ' – Kuldeep

Powiązane problemy