2016-11-05 2 views
0

Я пытаюсь понять, почему этот обмен не работает должным образом. Я добавил p проверить значения на repl.it Это метод раздел для сортировки:Ruby Variables Swap confusion

def partition (array, from, to) 
    #declared pivot to last index of array 
    pivot = array[to] 
    pIndex = from 
    for i in from..to-1 
     if array[i] <= pivot 
      array[i], array[pIndex] = array[pIndex], array[i] 
      pIndex += 1 
     end 
    end 
    p pivot 
    p array[to] 
    ### why doesn't this work properly? pivot is same as array[to] 
    ### array[pIndex], pivot = pivot, array[pIndex] 
    ### the swap below works 
    array[pIndex], array[to] = array[to], array[pIndex] 
    p array 
    return pIndex 
end 

У меня есть pivot = array[to]. Затем он заменяется массивом [pIndex]: array[pIndex], pivot = pivot, array[pIndex] и array[pIndex] Значение изменяется на pivot, но pivot не изменилось на array[pIndex]. Но когда я делаю это вместо: array[pIndex], array[to] = array[to], array[pIndex] он отлично работает. Может ли кто-нибудь сказать мне, почему?

Пример с массивом:

arr = [7, 2, 1, 6, 8, 5, 3, 4]

partition(arr, 0,7)

До последнего обмена происходит массив [2, 1, 3, 6, 8, 5, 7, 4]. Моя последняя строка свопинга предполагает обмен pivot, который равен 4, с array[pIndex], который равен 6. Это должно изменить массив на [2, 1, 3, 4, 8, 5, 7, 6].

+0

Видеть 'for' в Ruby-коде очень необычно. '(from ... to) .each do | i |' более типичный Ruby. – tadman

ответ

0

Давайте сломаем то, что здесь выполняет параллельное назначение.

Скажем, у нас есть массив:

arr = [1, 2] 
arr[0], arr[1] = arr[1], arr[0] 
# arr => [2, 1] 

Это ожидаемое поведение - мы одновременно делаем две следующие операции:
arr[0] = arr[1] и arr[1] = arr[0].

Теперь предположим, что мы делаем

arr = [1, 2] 
first = arr[0] 
first, arr[1] = arr[1], first 
# arr => [1, 1] 
# first => 2 

Это потому, что теперь мы делаем first = arr[1] и arr[1] = first.
first - это переменная, установленная на значение, найденное в arr[0], и изменение этой переменной НЕ мутирует массив.

+1

smh момент прямо там ... lol. Ну, я все еще в фазе обучения! Спасибо за очищение, что @Damon – hockmode

+0

@hockmode np, у всех есть такие моменты на каждом уровне мастерства :) – Damon