2013-05-25 3 views
13

Локальные переменные, определенные вне нити, кажется, виден изнутри так, что следующие два варианта использования Thread.new, кажется, то же самое:Когда вам нужно передать аргументы в `Thread.new`?

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

document приводит пример:

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

но так как a, b, c видны внутри созданной нити, это должно быть то же самое, что и:

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

Есть ли разница? Когда вам нужно передать локальные переменные в качестве аргументов в Thread.new?

ответ

15

Когда вы передаете переменную в поток, как это, то поток делает локальную копию переменного и использует его, поэтому изменения в нем не влияют на переменном вне нити, переданных в

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

Хороший ответ. К точке. – sawa

+0

Если мы являемся первостепенным значением 'd' внутри потока, тогда каков прецедент, чтобы передать его в качестве аргумента? И если мы выполняем какую-либо операцию на 'd', тогда она отражается в значении' a'. '' ' a =" foo " Thread.new {a =" new "} p a Thread.new (a) do | d | d.prepend ("old") puts d # => "oldnew" ставит # => "oldnew" конец '' ' – Kuldeep

Смежные вопросы