method_missing的多个参数

时间:2010-11-04 02:28:51

标签: ruby-on-rails jruby method-missing

我在模型中实现了以下method_missing代码:

# class Thought
  def self.method_missing(method_id, *arguments, &block)
    if $CLIENT.respond_to?(method_id)
      $CLIENT.send(method_id, *arguments, &block)
      # Do some stuff with it
    else
      super
    end
  end

$CLIENT是一个全局对象。请注意,method_missing,而不是实例。

我在脚本/控制台中尝试了以下内容:

>> $CLIENT.respond_to?(:my_thoughts)
=> true
>> $CLIENT.send(:my_thoughts, 'bob', 5)
=> #<#<Class:01xe229be>:0x241391>
>> Thought.send(:my_thoughts, 'bob', 5)
ArgumentError: wrong # of arguments(1 for 2)
        from [filepath]:50:in `method_missing'
        from (irb):4

我有什么不明显的东西在这里失踪吗?我在Rails 2.3.8和jRuby上运行它,如果这有所不同。

修改:这让我更加困惑:

>> Thought.send(:my_thoughts, 'bob', 5, 5)
ArgumentError: wrong # of arguments(3 for 2)
        from [filepath]:50:in `method_missing'
        from (irb):23

用Integer之外的其他东西替换第二个参数似乎有效,但当然这个参数应该是一个Integer ...我现在怀疑jRuby或我集成到这里的Java类中的问题。 / p>

2 个答案:

答案 0 :(得分:2)

你提供的代码对我来说都适用于ruby-1.8.7以及ruby-1.9.2,所以听起来你正在使用的jRuby版本中存在一个错误。为了完整性,这是我运行的代码:

#!/usr/bin/env ruby

class Client
    def my_thoughts(person, val)
        puts "#{person} is thinking #{val}"
    end
end

$CLIENT = Client.new

class Thought
    def self.method_missing(method_id, *arguments, &block)
        if $CLIENT.respond_to?(method_id)
            $CLIENT.send(method_id, *arguments, &block)
            # Do some stuff with it
        else
            super
        end
    end
end

Thought.send(:my_thoughts, 'bob', 5)

答案 1 :(得分:0)

事实证明问题实际上是我从上面省略的部分:

$CLIENT.send(method_id, *arguments, &block).collect |item|

显然它有一个定义的“收集”方法,它带有2个参数,这让我误以为它是可数的...去图。