2016-03-26 8 views
0

Я пытаюсь написать функцию, которая принимает строку и принимает нужные индексы и шифрует строку:назначения строк не работает должным образом

def scramble_string(string, positions) 
    temp = string 
    for i in 0..(string.length-1) 
    temp[i] = string[positions[i]] 
    end 
    puts(string) 
    return temp 
end 

Когда я вызываю выше методику, «строка», изменяются, который вы увидите на выходе puts.

Почему это происходит, так как я не положил string в левую часть уравнения, которое я бы не ожидал, что он будет изменен.

+3

[Возможный дубликат] (http://stackoverflow.com/questions/1465569/ruby-how-can-i-copy-a-variable-without-pointing-to-the-same-object) – rdupz

+0

Когда вы спрашиваете, пожалуйста, укажите пример ввода и ваш ожидаемый результат. См. «[Mcve]». –

+0

Хотя это не дубликат, http://stackoverflow.com/a/1872159/128421 объяснит, что происходит очень красиво. –

ответ

1

Вам нужен string.dup:

def scramble_string(string, positions) 
    temp = string.dup 
    for i in 0..(string.length-1) 
    temp[i] = string[positions[i]] 
    end 
    puts(string) 
    return temp 
end 

Для более понимающим попробуйте следующий фрагмент кода:

string = 'a' 
    temp = string 
    puts string.object_id  
    puts temp.object_id  

В результате двух одинаковых идентификаторов объекта, другими словами, является то, что обе переменные являются одинаковыми объект.

С:

string = 'a' 
    temp = string.dup 
    puts string.object_id  
    puts temp.object_id  

    puts string.object_id == temp.object_id #Test for same equal -> false 
    puts string.equal?(temp) #Test for same equal -> false 
    puts string == temp #test for same content -> true 

вы получите два разных объекта, но с тем же содержанием.

Смежные вопросы