繁体   English   中英

Ruby Array.each 的奇怪行为

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM