开发者

How do I swap array elements using parallel assignment?

开发者 https://www.devze.com 2023-01-25 06:41 出处:网络
I am trying to swap two elements in an array like this deck = [] (deck << (1..52).to_a << \'A\' << \'B\').flatten!

I am trying to swap two elements in an array like this

deck = []
(deck << (1..52).to_a << 'A' << 'B').flatten!
p deck
deck[deck.index("A")], deck[deck.index("B")] = deck[deck.index("B")], deck[deck.index("A")] #swap "A" and "B"
p deck

But it doesnt swap. If i do th开发者_运维技巧is, however:

deck[52], deck[53] = deck[53], deck[52]

it works. Any suggestions?


To make things simple, let deck be just ['A', 'B']. Here is step-by-step evaluation:

deck = ['A', 'B']
deck[deck.index("A")], deck[deck.index("B")] = deck[deck.index("B")], deck[deck.index("A")] # deck == ['A', 'B']
deck[deck.index("A")], deck[deck.index("B")] = deck[1], deck[0] # deck == ['A', 'B']
deck[deck.index("A")], deck[deck.index("B")] = 'B', 'A' # deck == ['A', 'B']
deck[0], deck[deck.index("B")] = 'B', 'A' # deck == ['A', 'B']
# Applying first assignment.
..., deck[deck.index("B")] = ..., 'A' # deck == ['B', 'B']
# NOTE: deck.index("B") is 0 now, not 1!
..., deck[0] = ..., 'A' # deck == ['B', 'B']
# Applying second assignment.
... # deck == ['A', 'B']

So what your code actually does is just assinging twise to the same element of array.

In order to fix this issue, just save deck.index() values to temporary arrays:

deck = []
(deck << (1..52).to_a << 'A' << 'B').flatten!
p deck
index_a, index_b = deck.index("A"), deck.index("B")
deck[index_a], deck[index_b] = deck[index_b], deck[index_a]
p deck

0

精彩评论

暂无评论...
验证码 换一张
取 消