我想通过引入一个新的运算符(例如:=
)
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}
答案 0 :(得分:3)
所以我认为你又回到了破解parse.y并重建你的Ruby。
答案 1 :(得分:2)
首先,superators的语法是
superator ":=" do |operand|
#code
end
这是一个块,因为superator是一个元编程宏。
其次,你有Marshal
的东西......但它有点神奇。只要您完全了解它正在做什么,请随意使用它。
第三,你正在做的事情对于一个superator是不太可行的(我相信),因为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}