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

Ruby Observable类实现发布/订阅模式的代码实现问题

看起来你已经搭好了Ruby Observable的架子,但卡在了通知观察者的核心环节对吧?我来帮你补全这个实现,把整个发布订阅流程跑通。

首先你的Ticker类里已经用changed标记了状态变更,但还缺少通知观察者的关键调用,另外还需要定义观察者类并完成注册流程。下面是完整的可运行代码:

require "observer"

class Ticker
  # 定期获取股票价格
  include Observable
  attr_accessor :sleep_time

  def initialize(symbol, sleep_time)
    @symbol = symbol
    @sleep_time = sleep_time
  end

  def run
    last_price = nil
    loop do
      price = Price.fetch(@symbol)
      puts "#{@symbol}, Current price: #{price}"
      if price != last_price
        changed # 标记状态已发生变更
        notify_observers(@symbol, price) # 通知所有注册的观察者,传递股票代码和最新价格
        last_price = price
      end
      sleep(@sleep_time)
    end
  end
end

# 模拟获取股票价格的工具类(实际场景可替换为真实API调用)
class Price
  def self.fetch(symbol)
    # 用随机数模拟价格波动
    rand(100.0..200.0).round(2)
  end
end

# 观察者类:负责接收并处理价格更新消息
class PriceAlert
  # Observable要求观察者必须实现update方法,这是接收消息的入口
  def update(symbol, price)
    puts "📢 价格更新通知: #{symbol} 最新价格为 #{price}"
    # 这里可以添加自定义业务逻辑,比如价格阈值告警
    if price > 180.0
      puts "⚠️ #{symbol} 价格超过阈值!当前价格: #{price}"
    end
  end
end

# 测试发布订阅流程
if __FILE__ == $0
  # 实例化发布者:每2秒获取一次AAPL的价格
  ticker = Ticker.new("AAPL", 2)
  # 实例化观察者
  alert_observer = PriceAlert.new
  # 将观察者注册到发布者上
  ticker.add_observer(alert_observer)

  # 用线程启动ticker,避免无限循环阻塞主线程
  Thread.new { ticker.run }.join
end

关键细节说明:

  • notify_observers调用:在调用changed标记状态变更后,必须用这个方法把消息推送给所有已注册的观察者,你可以传递任意数量的业务参数(比如这里的股票代码和价格),这些参数会直接传入观察者的update方法。
  • 观察者的update方法:Ruby的Observable模块强制要求观察者实现这个方法,这是订阅者接收消息的唯一入口,你可以根据业务需求在这里扩展逻辑(比如写日志、发邮件、触发告警等)。
  • 多观察者支持:如果需要多个不同职责的观察者(比如一个记录日志,一个发送短信),只需要创建对应的观察者类,再调用ticker.add_observer注册即可,Observable会自动通知所有订阅者。

内容的提问来源于stack exchange,提问作者Limus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:13:50