Прежде всего, синтаксис для суператоров -
superator ":=" do |operand|
#code
end
Это блок, потому что суператор - это макрос метапрограммирования.
Во-вторых, у вас что-то происходит с Marshal
... но это немного волшебства. Не стесняйтесь использовать его, если вы точно понимаете, что вы делаете.
В-третьих, то, что вы делаете, не вполне выполнимо с суператором (я полагаю), потому что self
нельзя изменить во время функции. (если кто-то знает иначе, пожалуйста, дайте мне знать)
Кроме того, в вашем примере a
должен сначала существовать и быть определенным, прежде чем он сможет вызвать в нем метод :=
.
Ваша лучшая ставка, вероятно,:
class Object
def deep_clone
Marshal::load(Marshal.dump(self))
end
end
для генерации глубокого клона объекта.
a = (b = {}).deep_clone
b[1] = 2
p a # => {}
p b # => {1=>2}