Я хотел бы добиться следующего за счет введения нового оператора (например, :=
)Как создать оператор для глубокой копии/клонирования объектов в Ruby?
a := b = {}
b[1] = 2
p a # => {}
p b # => {1=>2}
Насколько я понимаю, мне нужно изменить Object
класс, но я не знаю, что делать для того, чтобы получить то, что я хочу.
require 'superators'
class Object
superator ":=" operand # update, must be: superator ":=" do |operand|
# self = Marshal.load(Marshal.dump(operand)) # ???
end
end
Не могли бы вы мне помочь?
Update
Хорошо, superators, вероятно, не поможет мне, но я все еще хочу такой оператор. Как я могу (или вы) создать расширение для Ruby, которое я мог бы загрузить как модуль?
require 'deep_copy_operator'
a !?= b = {} # I would prefer ":=" but don't really care how it is spelled
b[1] = 2
p a # => {}
p b # => {1=>2}
Несомненно, операнд идет после дела, верно? Потому что это блок-аргумент? – Chuck
Хорошо, спасибо, это действительно не блок, а метод. Использование 'deep_clone' помогло бы, но это делает его грязным, особенно если у вас нет 2, а 5 хэшей для инициализации. Поэтому мне действительно интересно, как сделать такого оператора. – Andrei
@chuck - Ты прав; Я сделал опечатку; @Andrei - Это невозможно без портирования, потому что вы в основном хотите изменить 'self', а также вызывать метод для объекта, который еще не определен. –