【问题标题】:Parallel assignment in ruby working differently for two equivalent code fragmentsruby 中的并行分配对于两个等效的代码片段的工作方式不同
【发布时间】:2011-08-20 19:24:56
【问题描述】:

下面的两个代码片段应该打印相同的内容,但事实并非如此。

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)

【问题讨论】:

    标签: ruby arrays slice parallel-assignment


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-08
      • 1970-01-01
      • 2012-10-06
      • 2015-10-27
      • 1970-01-01
      • 2021-10-06
      • 2014-09-02
      相关资源
      最近更新 更多