2 votes

Découvrez si un objet Ruby implémente une méthode qui accepte un certain nombre d'arguments.

Je veux savoir si je peux appeler une méthode count avec exactement 0 argument :

@object.count()

sur @object sans provoquer d'erreur. Existe-t-il une méthode qui puisse me donner cette information ?

Au cas où il n'y en aurait pas, y a-t-il un problème à le mettre en œuvre de cette manière ?

begin
  count = @object.count()
  # Do anything with the information
rescue ArgumentError => e
end

3voto

pascal betz Points 416

Premièrement : Vérifier le nombre d'arguments d'une méthode semble indiquer que quelque chose ne va pas. Deuxièmement, vous recherchez l'"arité" :

@object.method(:count).arity

Auparavant, vous pourriez vouloir vérifier si l'objet répond à la méthode donnée.

@object.respond_to?(:count) && @object.method(:count).arity == 0

Il faut savoir que si la méthode prend un nombre variable d'arguments, l'arité n'est pas si intuitive :

Pour les méthodes Ruby qui prennent un nombre variable -n-1, où n est le nombre d'arguments requis. Pour les méthodes écrites en C, renvoie -1 si l'appel prend un nombre variable d'arguments.

3voto

Jörg W Mittag Points 153275

Nous pouvons reformuler la question comme suit : la méthode a-t-elle des paramètres obligatoires ? Ou : aucun des paramètres n'est-il obligatoire ?

@object.method(:count).parameters.none? {|type, _| [:req, :keyreq].include?(type) }

Cela vous permettra d'attraper les méthodes qui ont des paramètres optionnels avec des arguments par défaut, les méthodes qui ont des paramètres de mots-clés optionnels avec des valeurs par défaut, et les méthodes qui ont des paramètres de repos optionnels.

Je trouve parameters beaucoup plus facile à gérer que la valeur de retour d'un seul entier, lourdement surchargée, de la fonction arity .

0voto

Andrew Schwartz Points 114

Vous souhaitez que le arity méthode :

@object.method(:count).arity

http://ruby-doc.org/core-2.2.0/Method.html#method-i-arity

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