维护实例引用
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
我已经为此奋斗了两个小时,但无法解决。想象一下我有这个 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