gpt4 book ai didi

ruby - ruby 中的并行分配对两个等效代码片段的工作方式不同

转载 作者:数据小太阳 更新时间:2023-10-29 08:40:59 25 4
gpt4 key购买 nike

下面的两个代码片段应该打印相同的内容,但实际上没有。

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)

最佳答案

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

从技术上讲,两个 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"]

关于ruby - ruby 中的并行分配对两个等效代码片段的工作方式不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5922331/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com