Ruby 块将self视为它发送到的对象

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

我有以下连接到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
      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写入并调用消息为#