Ruby中如何让SimpleExpression的not方法实例维护原实例引用?
解决方案:让
not返回的实例动态依赖原实例 我懂你的痛点——你想要exp3能跟着exp1的value变化而自动更新结果,而不是只停留在创建时的静态值。核心问题就是要让新实例持有原实例的引用,而不是复制一个固定的取反值。
这里有个清晰的实现方式,我们可以新增一个专门的NotExpression类来处理取反逻辑,它会保存对原SimpleExpression的引用,每次计算时动态取原实例的当前值:
class SimpleExpression attr_writer :value def initialize(value) @value = value end def evaluate @value end # 新增not方法,返回一个持有当前实例引用的NotExpression def not NotExpression.new(self) end end # 专门处理取反逻辑的类,依赖原表达式的实时值 class NotExpression def initialize(expression) @expression = expression # 保存原实例的引用 end def evaluate !@expression.evaluate # 每次调用都动态取原实例的当前值并取反 end end
测试一下效果:
exp1 = SimpleExpression.new(true) exp3 = exp1.not puts exp3.evaluate # 输出: false # 修改原实例的value exp1.value = false puts exp3.evaluate # 输出: true
为什么这个方案可行?
NotExpression并没有存储固定的取反结果,而是保留了对原SimpleExpression实例的引用。- 每次调用
exp3.evaluate时,它都会主动去获取原实例的最新evaluate结果,再取反,这样就能完美同步原实例的变化。
原思路的问题所在
如果之前你尝试的是在not方法里直接返回SimpleExpression.new(!@value),那本质是创建了一个完全独立的新实例,它的@value只是原实例当时值的副本,和原实例没有任何关联——所以原实例后续修改value时,新实例根本感知不到。
内容的提问来源于stack exchange,提问作者Delsh
相关产品推荐
相关产品推荐

