У меня есть класс 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
?