Ruby 块将self视为它发送到的对象
我有以下连接到WebSocket的代码Ruby 块将self视为它发送到的对象,ruby,Ruby,我有以下连接到WebSocket的代码 class Connection < AbstractConnection def initialize @conn = WebSocket::Client::Simple.connect @url @conn.on :message do |event| puts 'received message' #this is the weird part puts self eve
class Connection < AbstractConnection
def initialize
@conn = WebSocket::Client::Simple.connect @url
@conn.on :message do |event|
puts 'received message'
#this is the weird part
puts self
event_data = event.data.to_json
on_message event_data
end
end
end
类连接
奇怪的是,在这些块中self等于Websocket:Client:Simple,而我在块中调用的那些方法丢失了,所以出现了一个错误
我用来连接websocket的库是
它使用事件发射器gem在收到消息时发出事件
我真的希望这些块将self标识为它们的创建位置——就像它们在.each方法中所做的那样
问题是发生了什么,我如何调用本地方法
我真的希望这些块将self标识为它们的创建位置——就像它们在.each方法中所做的那样
通常情况下,如果所使用的方法产生或blk.call
,则会发生这种情况,但在本例中,
方法上的,以及更高版本,因此它在WebSocket::Client::Simple::Client
的上下文中执行
不幸的是,仅仅从签名无法判断任何给定的方法将如何处理传递给它的块
一个选项可能是在块之前将self
的值存储在局部变量中。在不同的上下文中执行时,块中的局部变量仍然可用
# capture self
this = self
@conn.on :message do |event|
# ...
# use this to call methods
this.on_message event_data
end
您在哪一行得到错误,错误是什么?on_消息抛出一个NoMethodError,main中不存在任何_消息,但代码无法识别它,由于self是Websocket::Client::simple,您在消息上定义的确切位置是什么?添加了更多上下文-但奇怪的是,puts self写入并调用消息为#