120 votes

Volitelné parametry

Si je définis un Ruby fonctionne 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 ce n'est pas quelque chose comme

 ldap_get( base_dn, filter, , X)
 

possible ou si c'est possible, comment peut-on le faire?

137voto

jshen Points 3888

Il est presque toujours préférable d’utiliser un hachage d’options.

 def ldap_get(base_dn, filter, options = {})
  options[:scope] ||= LDAP::LDAP_SCOPE_SUBTREE
  ...
end

ldap_get(base_dn, filter, :attrs => X)
 

130voto

tomafro Points 3852

Ce n'est pas possible avec Ruby actuellement. Vous ne pouvez pas transmettre d'attributs "vides" aux méthodes. Le plus proche que vous pouvez obtenir est de passer à zéro:

 ldap_get(base_dn, filter, nil, X)
 

Toutefois, cela définira l'étendue sur nil, pas sur LDAP :: LDAP_SCOPE_SUBTREE.

Ce que vous pouvez faire est de définir la valeur par défaut dans votre méthode:

 def ldap_get(base_dn, filter, scope = nil, attrs = nil)
  scope ||= LDAP::LDAP_SCOPE_SUBTREE
  ... do something ...
end
 

Maintenant, si vous appelez la méthode comme ci-dessus, le comportement sera comme vous le souhaitez.

53voto

steenslag Points 29662

Le temps a passé et depuis la version 2, Ruby supporte les paramètres nommés:

 def ldap_get ( base_dn, filter, scope: "some_scope", attrs: nil )
  p attrs
end

ldap_get("first_arg", "second_arg", attrs: "attr1, attr2") # => "attr1, attr2"
 

3voto

Chris Bunch Points 25857

Il n'est pas possible de le faire de la manière que vous avez définies ldap_get. Cependant, si vous définissez ldap_get comme ceci:

def ldap_get ( base_dn, filter, attrs=nil, scope=LDAP::LDAP_SCOPE_SUBTREE )

Maintenant, vous pouvez:

ldap_get( base_dn, filter, X )

Mais maintenant, vous avez un problème que vous ne pouvez pas l'appeler avec les deux premiers arguments et la dernière arg (le même problème qu'avant, mais maintenant la dernière argument est différent).

La raison pour cela est simple: Chaque argument en Ruby n'est pas nécessaire d'avoir une valeur par défaut, donc vous ne pouvez pas appeler cela de la manière que vous avez spécifié. Dans votre cas, par exemple, les deux premiers arguments n'ont pas de valeurs par défaut.

-1voto

m4risU Points 880

C'est possible :) Il suffit de changer la définition

def ldap_get ( base_dn, filter, scope=LDAP::LDAP_SCOPE_SUBTREE, attrs=nil )

pour

def ldap_get ( base_dn, filter, *param_array, attrs=nil )
scope = param_array.first || LDAP::LDAP_SCOPE_SUBTREE

le champ d'application serait maintenant dans le tableau sur la première place. Lorsque vous fournissez des 3 arguments, alors vous aurez attribué base_dn, filtre et attrs et param_array sera [] Quand 4 et plus d'arguments alors param_array sera [argument1, or_more, and_more]

La baisse est... il est difficile de solution, vraiment moche. C'est pour répondre à ce qu'il est possible d'omettre l'argument dans le milieu de la fonction d'appel en ruby :)

Une autre chose que vous avez à faire est de réécrire la valeur par défaut du champ.

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