我已经与此争斗了两个小时,但无法解决。想象一下,我有这堂课:
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中的方法,我没有写它,因为我真的不知道如何。
答案 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