2010-11-04 8 views
0

J'ai le code method_missing suivants mis en œuvre dans un modèle:plusieurs arguments pour 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 est un objet global. Notez que ceci est method_missing pour la classe , pas l'instance.

J'ai essayé les éléments suivants dans le script/console:

>> $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 

Est-je quelque chose douloureusement évident me manque ici? Je cours ceci sur Rails 2.3.8 et jRuby si cela fait une différence.

Modifier: Cela me embrouille encore plus:

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

Remplacement du deuxième argument avec autre chose qu'un entier semble fonctionner, mais bien sûr l'argument est censé être un entier ... I Je suspecte maintenant un problème dans jRuby ou les classes de Java que j'ai intégrées dans ceci.

+0

Merci pour votre montage - j'allais dire, ce n'est pas toute l'histoire. J'ai testé le code que vous avez donné ci-dessus, et cela fonctionne très bien. la ligne 50 réelle du fichier avec method_missing en révélerait beaucoup. –

Répondre

0

Transforme le problème était en fait la partie que j'omis d'en haut:

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

Apparemment, il avait une méthode « recueillir » définie qui a 2 arguments, qui m'a trompé en pensant que c'était Enumerable ... allez comprendre.

2

Le code que vous avez fourni fonctionne à la fois pour ruby-1.8.7 et ruby-1.9.2, donc il semble qu'il y ait un bug dans la version de jRuby que vous utilisez. Pour être complet, voici le code que je courais:

#!/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

Je viens de tester avec jruby 1.5.3 (installé via rvm) et ça a marché aussi. –

+0

Il s'avère que le problème était dû à une hypothèse que j'ai faite concernant la bibliothèque Java que j'utilisais, désolé de perdre votre temps. – Karl

Questions connexes