Почему String :: Sub! () Измените оригинал клонированного объекта в Ruby?

StackOverflow https://stackoverflow.com/questions/4206177

  •  25-09-2019
  •  | 
  •  

Вопрос

У меня есть структура в моем RUBY-код, который выглядит несколько так

Parameter = Struct.new(:name, :id, :default_value, :minimum, :maximum)

Позже я создаю экземпляр этой структуры, используя

freq = Parameter.new('frequency', 15, 1000.0, 20.0, 20000.0)

В какой-то момент мне нужен точный дубликат этой структуры, поэтому я звоню

newFreq = freq.clone

Тогда я меняюсь newFreqимя

newFreq.name.sub!('f', 'newF')

Который, чудесным образом, изменения freq.name, слишком!

Простое задание, как newFreq.name = 'newFrequency' не меняется freq.

Это так, как это должно работать?

Редактировать: Это хорошая идея использовать класс вместо структуры и перегрузки clone сделать глубокую копию?

Это было полезно?

Решение

newFreq неглубокая копия freq. Отказ Это означает, что каждая из ссылок, хранящихся внутри newFreq указывает на объект, как те, которые хранятся в freq. Отказ Вы можете изменить, где референторы независимо (newFreq.name = newFreq.name.sub 'f','newF'), но если вы позвоните методу, который мутирует объект, оба newFreq а также freq будет затронут.

Смотрите также http://en.wikipedia.org/wiki/object_copy.

Другие советы

То Object#clone Метод выполняет мелкую копию. Тебе нужно Глубокая копия чтобы сделать работу.

Следовать эта ссылка узнать о глубокой копии в Руби.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top