ruby:如何在不更改其初始值的情况下使用Array?

Mes*_*Qin -3 ruby dictionary

我以前有使用python的经验,并且对ruby非常陌生。阵列真的让我感到困惑。这是我的代码示例:

edges = [[[1, 2], [100, 200]], [[700, 400], [1000, 2000]]]

new_edges = Array.new(edges)
new_edges.map{|edge| edge.map{|point| point.insert(0, 808912)}}

edges
#=> [[[808912, 1, 2], [808912, 100, 200]], [[808912, 700, 400], [808912, 1000, 2000]]]

new_edges
#=> [[[808912, 1, 2], [808912, 100, 200]], [[808912, 700, 400], [808912, 1000, 2000]]]
Run Code Online (Sandbox Code Playgroud)

我相信会发生的是,in中的值edges不会更改,而in 会new_edges更改,但是,两者都会更改。我如何创建初始数组的副本并进行操作而不更改任何缩写?

Ama*_*dan 6

您的代码具有与Python中相同的问题:

edges = [[[1, 2], [100, 200]], [[700, 400], [1000, 2000]]]
new_edges = list(edges)
for edge in edges:
    for point in edge:
        point.insert(0, 808912)
print(edges)
Run Code Online (Sandbox Code Playgroud)

即你变换外阵列,但内阵列仅由参考保持,从而改变一个(通过insert)正在改变两者的深内容edgesnew_edges。通过使用此工具逐步遍历代码,可以很容易地理解这类问题(尽管名称如此,它同时适用于Python和Ruby)。

在Ruby中,insert您可以使用,而不是使用修改数组的+,而不是:

edges = [[[1, 2], [100, 200]], [[700, 400], [1000, 2000]]]
new_edges = edges.map { |edge| edge.map { |point| [808912] + point } }
# => [[[808912, 1, 2], [808912, 100, 200]], [[808912, 700, 400], [808912, 1000, 2000]]]
edges
# => [[[1, 2], [100, 200]], [[700, 400], [1000, 2000]]]
Run Code Online (Sandbox Code Playgroud)