参数改变搞乱代码
Argument altering messing up code
当调用第二个方法时,初始方法的参数 rec1
和 rec2
被更改,并且 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
数组发生变化的原因是因为 rec1
和 rec2
是二维数组,这意味着 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 }
那么您将能够修改 rec1
和 rec2
而不会影响 fourpoints
。
另一种深度复制数组的方法是使用 Marshal::load
和 Marshal::dump
fourpoints = Marshal.load(Marshal.dump(rec1)) + Marshal.load(Marshal.dump(rec2))
当调用第二个方法时,初始方法的参数 rec1
和 rec2
被更改,并且 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
数组发生变化的原因是因为 rec1
和 rec2
是二维数组,这意味着 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 }
那么您将能够修改 rec1
和 rec2
而不会影响 fourpoints
。
另一种深度复制数组的方法是使用 Marshal::load
和 Marshal::dump
fourpoints = Marshal.load(Marshal.dump(rec1)) + Marshal.load(Marshal.dump(rec2))