你什么时候需要将参数传递给`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 < [1, 2, 3] 

但由于abc在创建的线程内部是可见的,因此它也应该与:

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

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

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

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