这有点难以解释,但我似乎偶尔无法覆盖我的应用程序中的'send'方法。我正在创建一个基于EventMachine的相当大的应用程序,有时候,在我的代码的深处,我决定在我的一个类中定义一个'send'方法。当我稍后尝试使用此方法时,我通常会得到类似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”方法的名称更改为“send_message”来解决的。
所以,由于这有点笼统,问题是,有什么样的事情会影响我在定义它的对象上调用自定义send
方法的能力?
仅供参考:我在OSX上使用Ruby 1.9.2p180。
答案 0 :(得分:2)
不建议使用或覆盖send
方法。 Object.send是Ruby Kernel Module中非常基本的方法。当我定义Message.send
类时,我遇到了很多问题,最后使用了不同的名称,例如Message.transmit
。在Ruby on Rails中,它是reserved word。