1

我还在学习红宝石的基础知识,所以我想我会尝试制作一个乘法表

x = (0..7).to_a
y = []
x.each { y << x }

y现在是一个 8x8 数组,其中每一行都是相等的。这些只是我不想要的占位符值,因此我尝试遍历数组索引以更改值。

x.each { |i| y[i][i] = i * i }

此时,y变成一个包含 8 列的数组[0, 1, 4, 9, 16, ...]。我理解为什么我只收到平方值,但我不明白为什么y[1][3],例如,当我只期望索引值如 , 被改变时,为什么会[1][1][2][2]改变。

此外,即使我从未故意重新分配它的值,也会重新分配 的值x[0, 1, 4, 9, 16, ...]通过上面的代码部分,它的值被自动重新分配,我不明白为什么。

我总是可以自己查找另一种方法来制作这样的表,但我想了解发生了什么x导致它改变了它的值,以及为什么通过索引的迭代没有按预期运行。当我能理解为什么我更简单的尝试会产生无效输出时,我将继续更正确地迭代 2D 数组的每个索引。我想自己解决这个相当基本的任务,但我现在遇到了障碍。

4

1 回答 1

5

您输入的是对完全相同 objecty的 8 个引用。因此,当您更改 时,与 相同,与等相同。 xy[1][1]x[1]y[2][1]y[3][1]

的值x没有被重新分配。相反,x是一个 8 元素数组;此对象是y8 倍的元素,也是 的值x;的每次迭代都在each修改该数组的内容。

如果您不习惯,这是非常违反直觉的。也许以下可怕的类比会有所帮助。假设你刚刚成立了一个秘密社团,而此刻你是唯一的成员。(这是一个非常秘密的社团。) 特别是:你是社团的主席、秘书和司库。你也有工作;比如说,你是微软的 CEO。

现在,一个敌对秘密社团的成员来了,打断了你的秘密社团主席的左脚趾。(显然这还不够秘密。)另一个人过来打断了秘书的右膝盖骨。另一个打碎了司库的牙齿。现在,瞧,事实证明,微软的 CEO 遭受了所有这些侮辱。怎么可能?从来没有人告诉过任何人要打破微软 CEO 的膝盖骨!

当然,这并不难:同一个人可以担任所有这些角色;如果你要求 Mangrove-Throat-Wobbler Society 的主席就像你要求它的秘书,或者你要求 Microsoft 的 CEO,你会得到完全相同的人。

在 Ruby(以及许多其他类似的语言)中,变量与其值之间的关系,或数组中的位置与保存在那里的东西之间的关系,更像是官方职位与其持有者之间的关系,而不是像盒子与其内容之间的关系。完全相同的东西可以是许多变量的值,就像完全相同的人可以是总统、秘书、财务和大维尼一样。

于 2012-06-14T23:32:04.487 回答