gpt4 book ai didi

ruby - 使用并行赋值交换数组元素

转载 作者:数据小太阳 更新时间:2023-10-29 07:31:11 26 4
gpt4 key购买 nike

this question 感兴趣,我玩过一些并行赋值数组和方法调用。所以这是一个典型的例子,试图通过它们的值交换数组中的两个成员:

deck = ['A', 'B', 'C']
#=> ["A", "B", "C"]
deck[deck.index("A")], deck[deck.index("B")] = deck[deck.index("B")], deck[deck.index("A")]
#=> ["B", "A"]
deck
#=> ["A", "B", "C"]

数组没有改变。但是如果我们改变参数的顺序,它就会起作用:

deck[deck.index("B")], deck[deck.index("A")] = deck[deck.index("A")], deck[deck.index("B")]
#=> ["A", "B"]
deck
#=> ["B", "A", "C"]

我猜这与在赋值中调用 index 方法的顺序有关,但看不清楚。有人可以解释下面的顺序吗?为什么第一个例子不交换成员,第二个例子呢?

最佳答案

这是预期的。它遵循 ruby​​ 计算表达式的方式。

deck[deck.index("A")], deck[deck.index("B")] = deck[deck.index("B")], deck[deck.index("A")]

暗示

deck[deck.index("A")], deck[deck.index("B")] = 'B', 'A'

注意:此处的字符串“A”和“B”仅供引用。 Ruby 不会在这里创建新的字符串对象。本质上是:

deck[deck.index("A")] = 'B' -> deck[0] = 'B' (deck = ['B', 'B', 'C'])
deck[deck.index("B")] = 'A' -> deck[0] = 'A' (deck = ['A', 'B', 'C'])

Array#index 在找到第一个匹配项时返回。

现在,

deck[deck.index("B")], deck[deck.index("A")] = deck[deck.index("A")], deck[deck.index("B")]
-> deck[deck.index("B")], deck[deck.index("A")] = 'A', 'B'
-> deck[deck.index("B")] = 'A' -> deck[1] = 'A' (deck = ['A', 'A', 'C'])
-> deck[deck.index("A")] = 'B' -> deck[0] = 'B' (deck = ['B', 'A', 'C'])

关于ruby - 使用并行赋值交换数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4182722/

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