Si je définis des fonctions Ruby comme ceci:
def ldap_get ( base_dn, filter, scope=LDAP::LDAP_SCOPE_SUBTREE, attrs=nil )
Comment puis-je l'appeler en fournissant uniquement les 2 premiers et les derniers arguments? Pourquoi quelque chose comme
ldap_get( base_dn, filter, , X)
possible ou si c'est possible, comment le faire?
ruby
optional-parameters
Bruno Antunes
la source
la source
scope
true et que vous passezfalse
,scope ||= true
cela ne fonctionnera pas. Il évalue la même chosenil
et le définira àtrue
xyz||=true
. Il dit que si c'est nul, c'est toujours vrai. Si c'est vrai, c'est vrai.scope ||= true
c'est mauvais , je suis surpris que personne n'ait mentionné que la meilleure façon de faire est de le fairescope = LDAP::LDAP_SCOPE_SUBTREE if scope.nil?
. Bien sûr, même cela suppose que cenil
soit une valeur invalide.nil
. Certains peuvent aimer la notation:ldap_get(base_dn, filter, _, X)
(note: je ne sais pas (encore) quand cela a été introduit dans Ruby. Sujet SO intéressant ).Il est presque toujours préférable d'utiliser un hachage d'options.
la source
options = default_options.merge(options)
Le temps a évolué et depuis la version 2, Ruby prend en charge les paramètres nommés:
la source
Il n'est pas possible de le faire comme vous l'avez défini
ldap_get
. Cependant, si vous définissezldap_get
comme ceci:Maintenant vous pouvez:
Mais maintenant vous avez le problème que vous ne pouvez pas l'appeler avec les deux premiers arguments et le dernier argument (le même problème qu'avant mais maintenant le dernier argument est différent).
La raison en est simple: chaque argument de Ruby n'est pas obligé d'avoir une valeur par défaut, vous ne pouvez donc pas l'appeler comme vous l'avez spécifié. Dans votre cas, par exemple, les deux premiers arguments n'ont pas de valeurs par défaut.
la source
1) Vous ne pouvez pas surcharger la méthode ( pourquoi ruby ne prend-il pas en charge la surcharge de méthode? ) Alors pourquoi ne pas écrire une nouvelle méthode?
2) J'ai résolu un problème similaire en utilisant l'opérateur splat * pour un tableau de longueur zéro ou plus. Ensuite, si je veux passer un ou plusieurs paramètres que je peux, il est interprété comme un tableau, mais si je veux appeler la méthode sans aucun paramètre, je n'ai rien à transmettre. Voir Ruby Programming Language pages 186/187
la source
Récemment, j'ai trouvé un moyen de contourner cela. Je voulais créer une méthode dans la classe du tableau avec un paramètre facultatif, pour conserver ou supprimer des éléments du tableau.
La façon dont j'ai simulé cela était de passer un tableau comme paramètre, puis de vérifier si la valeur à cet index était nulle ou non.
Essayer notre méthode de classe avec différents paramètres:
production:
["1", "2", "a", "b", "c"]
D'accord, c'est cool qui fonctionne comme prévu. Maintenant, vérifions et voyons ce qui se passe si nous ne transmettons pas la troisième option de paramètre (1) dans le tableau.
production:
["a", "b", "c"]
Comme vous pouvez le voir, la troisième option du tableau a été supprimée, initiant ainsi une section différente dans la méthode et supprimant toutes les valeurs ASCII qui ne sont pas dans notre plage (32-126)
Sinon, nous aurions pu attribuer la valeur nulle dans les paramètres. Ce qui ressemblerait au bloc de code suivant:
la source
C'est possible :) Il suffit de changer la définition
à
scope sera maintenant dans le tableau à sa première place. Lorsque vous fournissez 3 arguments, alors vous aurez assigné base_dn, filter et attrs et param_array sera [] Quand 4 arguments et plus alors param_array sera [argument1, or_more, and_more]
L'inconvénient est ... ce n'est pas une solution claire, vraiment moche. C'est pour répondre qu'il est possible d'omettre l'argument au milieu d'un appel de fonction dans ruby :)
Une autre chose que vous devez faire est de réécrire la valeur par défaut de scope.
la source
attrs=nil
) après un splat (*param_array
).¶meter
, mais dans Ruby 1.9, il pouvait également être suivi de "paramètres ordinaires". Dans les deux cas, un paramètre avec une valeur par défaut était légal après un paramètre avec un splat.Vous pouvez le faire avec une application partielle, bien que l'utilisation de variables nommées mène définitivement à un code plus lisible. John Resig a écrit un article de blog en 2008 sur la façon de le faire en JavaScript: http://ejohn.org/blog/partial-functions-in-javascript/
Il serait probablement possible d'appliquer le même principe dans Ruby (sauf pour l'héritage prototypique).
la source