Несколько аргументов для method_missing - PullRequest
0 голосов
/ 04 ноября 2010

В моей модели реализован следующий код 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-классах, которые я в нее интегрировал.

Ответы [ 2 ]

2 голосов
/ 04 ноября 2010

Код, который вы предоставили, работает для меня как на 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)
0 голосов
/ 04 ноября 2010

Оказывается, проблема была на самом деле с частью, которую я пропустил сверху:

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

Очевидно, у него был определен метод "collect", который принимал 2 аргумента, что заставило меня думать, что это Enumerable ... go figure.

...