参数改变搞乱代码

Argument altering messing up code

当调用第二个方法时,初始方法的参数 rec1rec2 被更改,并且 fourpoints(矩形两个角的数组)意外更改。

def rec_inter(rec1, rec2)
  foursides1 = []
  foursides2 = []
  fourpoints = rec1 + rec2
  p fourpoints
  points(rec1, foursides1)
  points(rec2, foursides2)
  crossing = foursides1 & foursides2
  # want to  do -> crossing & fourpoints <- to get intersections 
  p crossing
  p fourpoints #changes due to points method, how do I fix
end
def points(corners, rec)
  while corners[0][0] <= corners[1][0]
    rec << [corners[0][0], corners[0][1]]
    corners[0][0] = (corners[0][0] + 1)
  end
  while corners[0][1] <= corners[1][1]
    rec << [corners[1][0], corners[1][1]]
    corners[0][1] = (corners[1][0] + 1)
  end
  first = rec.flatten[0]
  while corners[1][0] >= first
    rec << [corners[1][0], corners[1][1]]
    corners[1][0] = corners[1][0] - 1
  end
  rec.uniq!
end

#rec1 & rec2 == cross refernce
rec_inter([[0, 0], [2, 1]], [[1, 0], [3, 1]])

有什么方法可以将这些值存储到一个在代码执行时不会改变的变量中吗?

您的 fourpoints 数组发生变化的原因是因为 rec1rec2 是二维数组,这意味着 ruby 不会复制数组。

这可以通过以下方式看出:

pry(main)> ary = [[1,2]]
=> [[1, 2]]
pry(main)> ary2 = [[3,4]]
=> [[3, 4]]
pry(main)> f = ary + ary2
=> [[1, 2], [3, 4]]
pry(main)> ary[0][0] = 10
=> 10
pry(main)> f
=> [[10, 2], [3, 4]]

为了解决这个问题,您需要深度复制数组

fourpoints = []
rec1.each { |a| fourpoints << a.dup }
rec2.each { |a| fourpoints << a.dup }

那么您将能够修改 rec1rec2 而不会影响 fourpoints

另一种深度复制数组的方法是使用 Marshal::loadMarshal::dump

fourpoints = Marshal.load(Marshal.dump(rec1)) + Marshal.load(Marshal.dump(rec2))