Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
"CaT"ends1_dup = s1.dups1_clone = s1.clones1 #=> "cat"s1_dup.upcase #=> "CAT" (синглетный метод не копируется)s1_clone.upcase #=> "СаТ" (используется синглетный метод)И
dupclonearr2arr1arr2[2]arr1Stringarr2arr1arr1 = [ 1, "flipper", 3 ]arr2 = arr1.duparr2[2] = 99arr2[1][2] = 'a'arr1 # [1, "flapper", 3]arr2 # [1, "flapper", 99]Иногда необходимо глубокое копирование, при котором копируется все дерево объектов с корнем в исходном объекте. В этом случае между оригиналом и копией гарантированно не будет никакой интерференции. Ruby не предоставляет встроенного метода для глубокого копирования, но есть приемы, позволяющие достичь желаемого результата.
Самый «чистый» способ — потребовать, чтобы классы реализовывали метод
deep_copydeep_copydeep_copyНо есть и более быстрый способ с использованием модуля
Marshalarr1 = [ 1, "flipper", 3 ]arr2 = Marshal.load(Marshal.dump(arr1))arr2[2] = 99arr2[1][2] = 'a'arr1 # [1, "flipper", 3]arr2 # [1, "flapper", 99]Обратите внимание, что изменение строки через
arr2arr111.1.10. Метод initialize_copy
При копировании объекта методом
dupcloneНо что делать, если вам такое поведение не нужно? Рассмотрим пример:
class Document attr_accessor :title, :text attr_reader :timestamp def initialize(title, text) @title, @text = title, text @timestamp = Time.now endenddoc1 = Document.new("Random Stuff",File.read("somefile"))sleep 300 # Немного подождем...doc2 = doc1.clonedoc1.timestamp == doc2.timestamp # true# Оп... временные штампы одинаковы!При создании объекта
DocumentДля этого нужно определить метод
initialize_copyinitializeclass Document # Определяем новый метод в классе. def initialize_copy(other) @timestamp = Time.now endenddoc3 = Document.new("More Stuff", File.read("otherfile"))sleep 300 # Немного подождем...doc4 = doc3.clonedoc3.timestamp == doc4.timestamp # false# Теперь временные штампы правильны.Отметим, что метод
initialize_copy@title, @text = other.title, other.textКстати, если метод
initialize_copy11.1.11. Метод allocate
Редко, но бывает, что нужно создать объект, не вызывая его конструктор (в обход метода
initializenewinitializeМетод
allocate
