242 votes

Compte tenu d’une classe, voir si l’instance a méthode (Ruby)

Je sais en Ruby que je peux utiliser `` pour vérifier si un objet a une certaine méthode.

Mais, compte tenu de la classe, comment puis-je vérifier si l’instance a une certaine méthode ?

C’est à dire, quelque chose comme

Mais j’ai l’impression qu’il y a obtenu d’être un meilleur moyen que d’instancier une nouvelle instance.

Quelles sont vos suggestions ? Merci.

379voto

banister Points 13181

Je ne sais pas pourquoi tout le monde est suggérant d’utiliser et quand `` fait le travail.

45voto

Vous pouvez utiliser `` comme suit :

Beaucoup plus facile, plus portable et plus efficace que le `` tout le monde semble le suggérer.

N’oubliez pas que vous ne saurez pas si une classe répond dynamiquement à certains appels avec , par exemple en redéfinissant , ou depuis Ruby 1.9.2 en définissant `` .

26voto

Alex V Points 8406

En fait, cela ne fonctionne pas pour les objets et les classes.

Cela fait:

 class TestClass
  def methodName
  end
end
 

Donc, avec la réponse donnée, cela fonctionne:

 TestClass.method_defined? :methodName # => TRUE
 

Mais cela ne fonctionne PAS:

 t = TestClass.new
t.method_defined? : methodName  # => ERROR!
 

Donc, je l'utilise pour les classes et les objets:

Des classes:

 TestClass.methods.include? 'methodName'  # => TRUE
 

Objets:

 t = TestClass.new
t.methods.include? 'methodName'  # => TRUE
 

10voto

Matchu Points 37755

EDIT: Cette réponse, c'est mieux. Apparemment, Ruby a construit dans cette, et j'ai un peu raté. Ma réponse de gauche de référence, peu importe.

Classes Ruby répondre aux méthodes instance_methods et public_instance_methods. En Ruby 1.8, la première répertorie tous les méthode d'instance des noms dans un tableau de chaînes de caractères, et la deuxième restreint à des méthodes publiques. Le second comportement est ce que vous souhaitez probablement, depuis respond_to? limite à des méthodes publiques par défaut, aussi bien.

Foo.public_instance_methods.include?('bar')

En Ruby 1.9, cependant, ces méthodes retournent des tableaux de symboles.

Foo.public_instance_methods.include?(:bar)

Si vous avez l'intention de le faire souvent, vous pouvez étendre Module d'inclure une méthode raccourci. (Il peut paraître étrange de les assigner à Module au lieu de Class, mais puisque c'est là que l' instance_methods méthodes vivre, il est préférable de garder en ligne avec le modèle.)

class Module
  def instance_respond_to?(method_name)
    public_instance_methods.include?(method_name)
  end
end

Si vous souhaitez soutenir à la fois Ruby 1.8 et Ruby 1.9, ce serait un endroit idéal pour ajouter de la logique de recherche de chaînes de caractères et de symboles, comme bien.

5voto

essayez Foo.instance_methods.include? :bar

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X