0

モデルに次の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

2 番目の引数を Integer 以外のものに置き換えるとうまくいくように見えますが、もちろん引数は Integer である必要があります... jRuby またはこれに統合した Java クラスのいずれかに問題があるのではないかと疑っています。

4

2 に答える 2

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)
于 2010-11-04T03:41:39.590 に答える
0

問題は、実際には上で省略した部分にあることがわかりました。

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

どうやら、2つの引数を取る「collect」メソッドが定義されていたようで、これにより、私はそれがEnumerableであると思い込んでしまいました...図を見てください。

于 2010-11-04T04:16:34.517 に答える