维护实例引用

Maintain instance reference

我已经为此奋斗了两个小时,但无法解决。想象一下我有这个 class:

class SimpleExpression
attr_writer :value

def initialize(value)
    @value = value
end

def evaluate
    @value
end

然后我想实例化它:

exp1 = SimpleExpression.new(true)
exp3 = exp1.not
p exp3.evaluate # This should give me false
exp1.value = false
p exp3.evaluate # This should give me true now

我真的不知道如何在 exp3 上维护 exp1 的引用,我尝试在 SimpleExpression 中创建一个方法来否定值和 returns self 但这显然不起作用,因为我会改变这两个实例。谢谢。 PS: 不应该是 SimpleExpression 中的方法,我没有写,因为我真的不知道怎么写。

如果它是简单的 "disconnected" 否定,那么实现会很简单:

def not
  SimpleExpression.new(!value)
end

这里,改变exp1不影响exp3

exp1 = SimpleExpression.new(true)
exp3 = exp1.not
p exp3.evaluate # => false
exp1.value = false
p exp3.evaluate # => false

但是制作它们 "live" 需要一些更高级的东西。我在想,一些包装对象。像这样,例如:

class SimpleExpression
  attr_accessor :value

  def initialize(value)
    @value = value
  end

  def evaluate
    @value
  end

  def not
    NegationWrapper.new(self)
  end

  private

  class NegationWrapper < DelegateClass(self)
    def evaluate
      !__getobj__.evaluate
    end
  end
end

exp1 = SimpleExpression.new(true)
exp3 = exp1.not
p exp3.evaluate # => false
exp1.value = false
p exp3.evaluate # => true