2009-03-29 4 views
7

J'ai une méthode comme ceci:Dans une méthode qui prend plusieurs paramètres facultatifs, comment peut-on spécifier le premier sauf le premier?

def foo(fruit='apple', cut="sliced", topping="ice cream") 
    # some logic here 
end 

Comment puis-je appeler où j'Override seul le paramètre en tête, mais utilise les valeurs par défaut pour les autres, quelque chose comme ça

foo('','','hot fudge') 

Bien sûr, cela ne fonctionne pas comme prévu, mais je veux seulement fournir une valeur pour le troisième paramètre optionnel, et avoir les deux premiers avec leurs valeurs par défaut. Je sais comment le faire avec un hachage, mais est-ce un raccourci pour le faire, en utilisant la syntaxe ci-dessus?

Répondre

17

Vous ne pouvez pas utiliser cette syntaxe pour cela dans ruby. Je recommanderais la syntaxe de hachage pour cela.

def foo(args={}) 
    args[:fruit] ||= 'apple' 
    args[:cut]  ||= 'sliced' 
    args[:topping] ||= 'ice cream' 
    # some logic here 
end 

foo(:topping => 'hot fudge') 

Vous pouvez aussi le faire en utilisant des arguments de position:

def foo(fruit=nil,cut=nil,topping=nil) 
    fruit ||= 'apple' 
    cut  ||= 'sliced' 
    topping ||= 'ice cream' 
    # some logic here 
end 

foo(nil,nil,'hot fudge') 

Gardez à l'esprit que ces deux techniques vous empêchent de passer nil réels arguments aux fonctions (lorsque vous voudrez peut-être parfois)

2

Non. Vous devez vérifier la valeur des paramètres dans la fonction foo. S'il s'agit de la chaîne vide ou null, vous pouvez les définir sur le paramètre par défaut.

15

À partir de Ruby 2.0, vous pouvez utiliser des arguments clés:

def foo(fruit: 'apple', cut: "sliced", topping: "ice cream") 
    [fruit, cut, topping] 
end 

foo(topping: 'hot fudge') # => ['apple', 'sliced', 'hot fudge'] 
+0

Et à partir de Ruby 2.1 il y a un support pour les 'arguments de mots-clés obligatoires', voir [notes de version] (https://github.com/ruby/ruby/blob/ruby_2_1/NEWS#L16-17) – Epigene

Questions connexes