1

这有点难以解释,但我似乎偶尔无法覆盖我的应用程序中的“发送”方法。我正在基于 EventMachine 创建一个相当大的应用程序,有时,在我的代码深处,我决定在我的一个类中定义一个“发送”方法。当我稍后尝试使用此方法时,通常会得到一个类似于 的异常TypeError: <parameter> is not a symbol,例如以下内容(可能是由所需的 AMQP gem(不是我的)引起的,但这个问题更笼统):

Exception caught: TypeError - #<AMQ::Protocol::MethodFrame:0x000001008434f0 @payload="\x002\x00\x14\x00\x00\x01a\tamq.topic\x00\x01\x00\x00\x00\x00", @channel=1> is not a symbol
/Users/mlartz/.rvm/gems/ruby-1.9.2-p180@rflow-component-devel/gems/amq-client-0.7.0.alpha27/lib/amq/client/queue.rb:137:in `bind'
/Users/mlartz/.rvm/gems/ruby-1.9.2-p180@rflow-component-devel/gems/amqp-0.8.0.rc12/lib/amqp/queue.rb:282:in `block in bind'
/Users/mlartz/.rvm/gems/ruby-1.9.2-p180@rflow-component-devel/gems/eventmachine-1.0.0.beta.3/lib/em/deferrable.rb:47:in `call'
/Users/mlartz/.rvm/gems/ruby-1.9.2-p180@rflow-component-devel/gems/eventmachine-1.0.0.beta.3/lib/em/deferrable.rb:47:in `callback'

这是违规行:

@connection.send(Protocol::Queue::Bind.encode(@channel.id, @name, exchange_name, routing_key, nowait, arguments))

在这种特殊情况下,@connection对象的类定义了一个send方法,该方法接受AMQ::Protocol::MethodFrame. 然而,似乎以某种方式Object#send调用了默认方法(它需要一个符号,因此是异常)。

在开发的早期,我在我的一个自定义类上遇到了同样的问题,通过将我的“发送”方法的名称更改为“发送消息”来解决这个问题。

所以,由于这有点笼统,问题是,什么样的事情会干扰我send在定义它的对象上调用自定义方法的能力?

仅供参考:我在 OSX 上使用 Ruby 1.9.2p180。

4

1 回答 1

2

不建议使用或覆盖该send方法。Object.send是 Ruby Kernel Module中一个非常基本的方法。当我定义一个Message.send类时,我曾经遇到过严重的问题,并最终使用了不同的名称,例如Message.transmit. 在 Ruby on Rails 中,它是一个保留字

于 2011-05-27T11:06:18.800 回答