如何将一个ruby实例变量设置为RxRuby Observable?
问题描述:
我计划将来自tcp端口的传入数据视为来自“视图”的数据。我想设置一些RxRuby Observables,然后根据我从tcp端口获得的数据,选择适当的Observable并通过调用on_next
方法发布一些内容。如何将一个ruby实例变量设置为RxRuby Observable?
下面的代码工作,但似乎笨拙。传递给Rx::Observable.create
的块只是为传入它的observable设置一个实例变量。这不是一个巨大的锅炉板,但有些东西看起来不正确。我错过了什么吗?
require 'rx'
class GUIMessagePublisher
attr_accessor :handshake, :handshake_stream, :remote_button, :remote_button_stream
def initialize
self.handshake_stream = Rx::Observable.create { |o| self.handshake = o }
self.remote_button_stream = Rx::Observable.create { |o| self.remote_button = o }
end
def publish_handshake
handshake.on_next("hello")
end
def publish_remote_button
remote_button.on_next(nil)
end
end
publisher = GUIMessagePublisher.new
publisher.handshake_stream.subscribe { |m| puts "message = #{m}"}
publisher.remote_button_stream.subscribe { puts "remote button clicked" }
publisher.publish_handshake
publisher.publish_remote_button
答
阅读更多的Rx ::主题后,我认为这将是处理这种
require 'rx'
require 'forwardable'
class GUIMessagePublisher
extend Forwardable
attr_accessor :handshake_subject, :remote_button_subject
def_delegator :handshake_subject, :as_observable, :handshake_stream
def_delegator :remote_button_subject, :as_observable, :remote_button_stream
def initialize
self.handshake_subject = Rx::Subject.new
self.remote_button_subject = Rx::Subject.new
end
def publish_handshake
handshake_subject.on_next("hello")
end
def publish_remote_button
remote_button_subject.on_next("remote button")
end
end
publisher = GUIMessagePublisher.new
publisher.handshake_stream.subscribe { |m| puts "message = #{m}"}
publisher.remote_button_stream.subscribe { |m| puts "remote button clicked, message = #{m}" }
publisher.publish_handshake
publisher.publish_remote_button
使用可转发的是可选的首选方式。我可以通过方法授权,甚至可以在暴露主题上调用.as_observable
,但这似乎是正确的。