Подтвердить что ты не робот

Когда вам нужно передать аргументы в "Thread.new"?

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

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

В документе приведен пример:

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?

4b9b3361

Ответ 1

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

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