Назначение строк не работает должным образом

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

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 в левой части уравнения, я не ожидал, что это изменится.


person Serdar Oztetik    schedule 26.03.2016    source источник
comment
Возможный дубликат   -  person rdupz    schedule 26.03.2016
comment
При запросе укажите пример ввода и ожидаемый результат. См. минимально воспроизводимый пример.   -  person the Tin Man    schedule 27.03.2016
comment
Хотя это и не дубликат, stackoverflow.com/a/1872159/128421 очень хорошо объяснит, что происходит.   -  person the Tin Man    schedule 27.03.2016


Ответы (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

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

person knut    schedule 26.03.2016