我想通过引入一个新的运营商来实现以下目标(例如:=
)
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
你能帮我做这个吗?
更新
好吧,超级教练可能不会帮我,但我还是想要这样的接线员。我(或者你)如何为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}
最佳答案
首先,superator的语法是
superator ":=" do |operand|
#code
end
这是一个块,因为supertor是一个元编程宏。
第二,你有一些东西和他们的
Marshal
…但这有点神奇。只要你清楚自己在做什么,就可以随意使用它。第三,使用superator(我相信)您所做的并不完全可行,因为
self
不能在函数期间修改(如果有人不知道,请告诉我)此外,在你的例子中,
a
必须先存在并被定义,然后才能调用方法“cc>”。你最好的选择可能是:
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}