什么时候需要将参数传递给`Thread.new`?

saw*_*awa 17 ruby multithreading local-variables

在线程外部定义的局部变量似乎从内部可见,因此以下两种用法Thread.new看起来是相同的:

a = :foo
Thread.new{puts a} # => :foo
Thread.new(a){|a| puts a} # => :foo
Run Code Online (Sandbox Code Playgroud)

文件给出了一个例子:

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

但由于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]
Run Code Online (Sandbox Code Playgroud)

有什么区别吗?什么时候需要将局部变量作为参数传递给Thread.new

con*_*t47 22

当您将变量传递给类似的线程时,该线程会生成变量的本地副本并使用它,因此对它的修改不会影响您传入的线程之外的变量

a = "foo"
Thread.new{ a = "new"}
p a # => "new"
Thread.new(a){|d| d = "old"} 
p a # => "new"
p d # => undefined
Run Code Online (Sandbox Code Playgroud)