Как поменять местами элементы массива с помощью параллельного присваивания? - PullRequest
0 голосов
/ 15 ноября 2010

Я пытаюсь поменять местами два элемента в массиве, как это

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

Но это не поменяет местами.Если я сделаю это, однако:

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

, это работает.Есть предложения?

1 Ответ

2 голосов
/ 15 ноября 2010

Чтобы упростить задачу, пусть колода будет просто ['A', 'B'].Вот пошаговая оценка:

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']

Итак, что ваш код на самом деле делает, так это просто передает значение на один и тот же элемент массива.

Чтобы устранить эту проблему, просто сохранитеЗначения deck.index () для временных массивов: 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...