我想通过引入一个新的运营商来实现以下目标(例如:=

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}

07-26 04:04