7
votes

Méthodes rubis et commande de plusieurs valeurs par défaut

Je semble ne pas être capable de le faire (que je pouvais faire en python). Permettez-moi d'expliquer ..

Supposons que j'ai la méthode suivante dans Ruby: xxx

maintenant pour appeler cette méthode, je pourrais faire xxx

et les arguments sont pris par leur ordre respectif .. Mais si je veux donner à l'ARG2 à un moment donné de ma programmation et que vous voulez les valeurs par défaut pour arg1 et arg3?

J'ai essayé d'écrire SOMEMETHOD (arg2 = 4) Mais cela ne semble pas fonctionner dans Ruby 1.9. Ce qu'il fait, c'est qu'il pense toujours que Arg1 est 4. Dans Python, je pouvais au moins s'en sortir avec cela, mais dans Ruby, je ne suis pas sûr. Est-ce que quelqu'un a des idées élégantes?


2 commentaires

arg2 = 4 dans Ruby attribue 4 à une variable locale nommée arg2 , peu importe où vous le mettez, parmi les arguments d'appel de fonction également.


Oui .. j'ai compris qu'après avoir essayé: p


3 Réponses :


2
votes

Pour ce que vous essayez de faire de la meilleure façon de faire le meilleur moyen d'utiliser un hasch comme argument.

someMethod(:arg1 => 2, :arg3 => 5)


0 commentaires

14
votes

Seule une solution élégante pour l'instant est d'utiliser HASH comme liste de paramètres: xxx pré>

et ultérieur dans le code utilise un hachage implicite lorsque vous appelez votre méthode: p>

fail "Unknown parameter name(s) " + (options.keys - defaults.keys).join(", ") + "." unless options.length == defaults.length


2 commentaires

Que diriez-vous de mettre les valeurs par défaut dans une variable, puis après la fusion échoue "Nom du paramètre inconnu" + (options.keys-défauts.Keys) .join (",") + "." Sauf si options.length == par défaut.Length


Pour être honnête, pour 2 ou 3 paramètres supplémentaires, je trouve cela énormément de travail. Je suppose qu'il serait encore plus efficace de taper les valeurs par défaut lorsque vous passez la valeur. Cela serait toutefois utile si vous avez beaucoup de paramètres dans votre méthode



2
votes

ruby ​​n'a pas d'argument de mots-clés passant. (Pas encore, de toute façon, c'est l'une des choses qui pourraient en faire entrer Ruby 2.0. Cependant, il n'y a pas de garantie et travaille sur Ruby 2.0 n'a même pas commencé em>, donc il n'y a pas de dire Quand ou même si nous verrons des arguments de mots-clés à Ruby.)

Qu'est-ce qui se passe vraiment em>, est-ce: vous passez l'expression arg2 = 4 code> comme seul argument de la liste d'arguments. Ruby est un langage strict avec une valeur passive, ce qui signifie que tous les arguments sont entièrement évalués avant leur passage à la méthode. Dans ce cas, arg2 = 4 code> est une expression d'affectation (en rubis, tout em> est une expression (c'est-à-dire tout renvoie une valeur), il n'y a pas de déclarations). Vous attribuez à la valeur littérale immédiate valeur code> 4 code> à la variable locale arg2 code>. Les expressions d'affectation toujours em> renvoient la valeur de leur côté droit, dans ce cas 4 code>. P>

Donc, vous passez la valeur 4 code> comme seul argument dans votre méthode, ce qui signifie qu'elle est liée au premier paramètre obligatoire s'il y en a un (dans ce cas, il n'y en a pas), sinon au premier paramètre facultatif (dans ce cas) > arg1 code>). p>

Le moyen habituel de traiter des situations telles que ceci est d'utiliser un hachage code>, comme celui-ci: P>

some_method(arg2: 4)


1 commentaires

Les arguments de mots-clés ont depuis été introduits dans Ruby 2.0, en 2013: ruby-lang.org/fr/news/2013/02/24/Ruby-2-0-0-P0-IS-Releed