似乎在线程之外定义的局部变量可以从内部访问,因此以下两个使用 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
?
d
的值,那么将其作为参数传递的用例是什么?如果我们对d
执行任何操作,则会反映在a
的值中。a = "foo" Thread.new { a = "new" } p a Thread.new(a) do |d| d.prepend("old") puts d # => "oldnew" puts a # => "oldnew" end
- Kuldeep#dup
或#clone
创建浅拷贝还是深拷贝?还是深拷贝?我猜测是浅拷贝。因此它试图帮助良好的线程纪律,但只能做到这一步。如果Ruby Thread类文档在这个主题上更具体一些就好了。感谢清晰的示例和答案。 - pjvleeuwena
和d
仍然具有相同的object_id
。因此,只有变量是新的,但引用了相同的(非复制/克隆)对象。所以执行d[1] = 'o'
将导致a = 'now'
。a = 'new'; Thread.new(a) { |d| d[1] = 'o' }.join; puts a
- pjvleeuwen