[英]Ruby odd behavior of Array.each
class Point
attr_accessor :x, :y
def initialize(x =0, y = 0)
@x = x
@y = y
end
def to_s
"x: #{@x}; y: #{@y}"
end
def move(x,y)
@x = @x + x
@y = @y + y
end
end
my_point= Point.new(4,6)
puts my_point
my_point.move(7,14)
puts my_point
puts
my_square = Array.new(4, Point.new)
a_square = []
my_square.each {|i| puts i}
puts
my_square.each do|i|
b = i
b.move(2,4)
a_square<< b
end
a_square.each {|i| puts i}
The result x: 4; y: 6 x: 11; y: 20 x: 0; y: 0 x: 0; y: 0 x: 0; y: 0 x: 0; y: 0 x: 8; y: 16 x: 8; y: 16 x: 8; y: 16 x: 8; y: 16
when it should be x: 4; y: 6 x: 11; y: 20 x: 0; y: 0 x: 0; y: 0 x: 0; y: 0 x: 0; y: 0 x:2; y: 4 x:2; y: 4 x:2; y: 4 x:2; y: 4
Array.new(4, Point.new)
将创建一个具有相同 object 的数组(在本例中是 Point 的一个实例)。
my_square = Array.new(4, Point.new)
p my_square.map(&:object_id).uniq.count
#=> 1
如果您更改为Array.new(4) { Point.new }
,这将使用不同的对象填充数组。
my_square = Array.new(4) { Point.new }
p my_square.map(&:object_id).uniq.count
#=> 4
检查此以获取更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.