2

下面的两个代码片段应该打印相同的东西,但它们没有。

ary = %W(1 2 5 6 B 8 5 4 6 5 6 9 7 A)
indx1 = 0...ary.index("B")
indx2 = (ary.index("A") + 1)..-1
ary[indx1], ary[indx2] = ary[indx2], ary[indx1]
puts ary.inspect

ary = %W(1 2 5 6 B 8 5 4 6 5 6 9 7 A)
ary[0...ary.index("B")], ary[(ary.index("A") + 1)..-1] = ary[(ary.index("A") + 1)..-1],  ary[0...ary.index("B")]
puts ary.inspect

第一个打印:

["B", "8", "5", "4", "6", "5", "6", "9", "7", "A", nil, nil, nil, nil, "1", "2", "5", "6"]

第二个:

["B", "8", "5", "4", "6", "5", "6", "9", "7", "A", "1", "2", "5", "6"]

他们不应该打印同样的东西吗?他们似乎和我一样。

(使用 Mac OSX 10.6.7 和 ruby​​ 1.9.2-p180)

4

1 回答 1

4

它们是不同的,因为在第一种情况下,您预先计算了索引,而在第二种情况下,您正在动态计算它们,并且数组在第一个赋值和第二个赋值之间发生变化。

从技术上讲,两个 RHS 评估都是在 LHS 分配之前进行的,但是两个 LHS 分配不能同时进行,所以在这种情况下,您实际上可以看到

A, B = C, D

相当于

A = C
B = D

所以你要做的第一件事是...

ary[0...ary.index("B")] = ary[(ary.index("A") + 1)..-1]

在这两种情况下。所以 ary 现在

["B", "8", "5", "4", "6", "5", "6", "9", "7", "A"]

现在,您最初将 indx1 和 indx2 分别计算为0...414..-1,但现在如果您重新计算 indx1 和 indx2 值,您将拥有:

indx1 = 0...ary.index("B")       #=> 0...0
indx2 = (ary.index("A") + 1)..-1 #= 10..-1

换句话说,

ary[indx2] = ary[indx1]

不再等同于

ary[(ary.index("A") + 1)..-1] = ary[0...ary.index("B")]

那是,

ary = ["B", "8", "5", "4", "6", "5", "6", "9", "7", "A"]
ary[(ary.index("A") + 1)..-1] = ary[0...ary.index("B")]

给你

ary #=> ["B", "8", "5", "4", "6", "5", "6", "9", "7", "A"]

尽管

ary = ["B", "8", "5", "4", "6", "5", "6", "9", "7", "A"]
ary[indx2] = ary[indx1]

给你

ary #=> ["B", "8", "5", "4", "6", "5", "6", "9", "7", "A", nil, nil, nil, nil, "1", "2", "5", "6"]
于 2011-05-07T16:41:36.057 回答