Какой метод определить в классе Ruby, чтобы дублировать/клонировать его экземпляры?

У меня есть класс Pointerс одним атрибутом :contents, который указывает на объект класса MyObject.

class MyObject
  def hello; "hello" end
end

class Pointer
  attr_reader :contents
  def initialize( cont ); @contents = cont end
  # perhaps define some more state
end

Я хочу, чтобы мой Pointerмог делать копии самого себя. Я знаю, что метод #dupопределен по умолчанию, в то время как ожидается, что метод #cloneбудет переопределен, чтобы иметь возможность делать глубокие копии. Но здесь копии не должны быть слишком глубокими. Итак, первая дилемма, которая у меня возникла, заключается в том, должен ли я переопределить метод #dup, потому что я действительно не хочу копировать дополнительное состояние моего Pointer, просто создать новое, указывающее на тот же экземпляр MyObject? Или мне следует воздержаться от переопределения #dup, потому что я не "должен" переопределять #cloneс помощью метода, делающего неглубокие копии?

Буду рад комментариям к вышеизложенному, но допустим, что я выберу переопределение #dup. Я мог бы сделать только это:

class Pointer
  def dup; self.class.new( contents ) end
end

Но в Интернете я прочитал что-то вроде «метод dup вызовет метод инициализации копии ». Кроме того, этот парень пишет о #initialize_clone, #initialize_dupи #initialize_copyна Ruby. Это заставляет меня задуматься, может быть, это лучшая практика?

class Pointer
  def initialize_copy
    # do I don't know what
  end
end

Или вот так?

class Pointer
  def initialize_dup
    # do I don't know what
  end
end

Или я должен просто забыть об онлайн-разглагольствованиях, написанных для того, чтобы сбить с толку новичков, и без проблем перейти к переопределению #dup?

Кроме того, я понимаю, что могу просто вызвать #dupбез определения какого-либо пользовательского #dup, но что , если я хочу определить #dupс другим поведением?

Кроме того, тот же вопрос относится к#clone-я должен попытаться определить #initialize_cloneили просто #clone?

9
задан Boris Stitnicky 25 February 2015 в 14:58
поделиться