85 votes

En Ruby, comment vérifier si la méthode "foo = ()" est définie?

En Ruby, je peux définir une méthode foo = (bar):

 irb(main):001:0> def foo=(bar)
irb(main):002:1>   p "foo=#{bar}"
irb(main):003:1> end
=> nil
 

Maintenant, je voudrais vérifier si cela a été défini,

 irb(main):004:0> defined?(foo=)
SyntaxError: compile error
(irb):4: syntax error, unexpected ')'
 from (irb):4
 from :0
 

Quelle est la syntaxe appropriée à utiliser ici? Je suppose qu'il doit y avoir un moyen d'échapper à "foo =" tel qu'il soit analysé et passé correctement au défini? opérateur.

136voto

molf Points 34978

Le problème est que la méthode foo= est conçue pour être utilisée dans les affectations. Vous pouvez utiliser defined? de la manière suivante pour voir ce qui se passe:

 defined? self.foo=()
#=> nil
defined? self.foo = "bar"
#=> nil

def foo=(bar)
end

defined? self.foo=()
#=> "assignment"
defined? self.foo = "bar"
#=> "assignment"
 

Comparez cela à:

 def foo
end

defined? foo
#=> "method"
 

Pour tester si la méthode foo= est définie, utilisez plutôt respond_to? :

 respond_to? :foo=
#=> false

def foo=(bar)
end

respond_to? :foo=
#=> true
 

44voto

Theo Points 60103

Vous pouvez vérifier si une méthode existe à l'aide de l' respond_to? méthode, et vous faire passer un symbole, par exemple, bar.respond_to?(:foo=) pour voir si l'objet bar a une méthode foo=. Si vous voulez savoir si les instances d'une classe de répondre à une méthode que vous pouvez utiliser method_defined? sur la classe (ou le module), par exemple, Foo.method_defined?(:bar=).

defined? n'est pas une méthode, mais un opérateur qui retourne une description de l'opérande (ou rien si elle n'est pas définie, qui est pourquoi il peut être utilisé dans une instruction if). L'opérande peut être n'importe quelle expression, c'est à dire une constante, une variable, une cession, une méthode, un appel de méthode, etc. La raison pourquoi il ne fonctionne pas, lorsque vous ne defined?(foo=) est parce que les parenthèses, les ignorer, et cela devrait fonctionner plus ou moins comme prévu. Cela étant dit, defined? est un drôle d'opérateur, et personne ne l'utilise pour tester l'existence de méthodes.

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