维护实例引用

时间:2018-03-25 01:02:50

标签: ruby oop reference composition

我已经与此争斗了两个小时,但无法解决。想象一下,我有这堂课:

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上创建一个方法来否定该值并返回self但是这显然不起作用,因为我&#39 ; d要改变两个实例。谢谢。 PS:不应该是SimpleExpression中的方法,我没有写它,因为我真的不知道如何。

1 个答案:

答案 0 :(得分:2)

如果它很简单"断开"否定,实施将变得简单:

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

但要让他们生活"需要更高级的东西。我在思考一些包装对象。像这样,例如:

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