You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:59:55