2009-02-24 11 views
55

Je sais que cela peut être une question stupide, mais je ne sais pas comment créer une méthode ruby ​​qui accepte un hachage de paramètres. Je veux dire, dans Rails, je voudrais utiliser une méthode comme ceci:Créer une méthode ruby ​​qui accepte un hachage de paramètres

login_success :msg => "Success!", :gotourl => user_url 

Quel est le prototype d'une méthode qui accepte ce genre de paramètres? Comment les lis-je?

Répondre

59

Si vous passez des paramètres à une fonction Ruby dans la syntaxe de hachage, Ruby supposera que c'est votre objectif. Ainsi:

def login_success(hsh = {}) 
    puts hsh[:msg] 
end 
+0

Est-ce que je ne peux pas utiliser quelque chose comme login_success (* params)? – collimarco

+5

a * (aka opérateur splat) signifie que la méthode accepte n'importe quel nombre d'arguments et les placera dans un tableau appelé params. Décider de l'utiliser ou non dépend de ce que vous recherchez. Dans l'exemple que vous avez fourni, un hachage a du sens. – Allyn

+6

Cela dit que vous attendez un certain nombre d'arguments. Comme 'foo (1,: b, '3')'. De plus, vous n'avez pas besoin de la partie "= {}" de cela. cela fonctionnera bien: def login_success (hash). Le code ci-dessus définit simplement la valeur par défaut comme un hachage vide. –

30

Une chose clé à retenir est que vous ne pouvez faire la syntaxe où vous quittez les caractères de hachage {}, si le paramètre de hachage est le dernier paramètre d'une fonction. Donc, vous pouvez faire ce qu'Allyn a fait, et cela fonctionnera. Aussi

def login_success(name, hsh) 
    puts "User #{name} logged in with #{hsh[:some_hash_key]}" 
end 

Et vous pouvez l'appeler avec

login_success "username", :time => Time.now, :some_hash_key => "some text" 

Mais si le hachage est pas le dernier paramètre que vous devez entourer les éléments de hachage avec {}.

5

Utilisez un seul argument. Ruby transformera les valeurs nommées dans un hachage:

def login_success arg 
# Your code here 
end 

login_success :msg => 'Success!', :gotourl => user_url 
# => login_success({:msg => 'Success!', :gotourl => user_url}) 

Si vous voulez vraiment vous assurer d'obtenir un hachage, au lieu de la frappe de canard rubis par défaut, vous aurez alors besoin de contrôler pour elle. Quelque chose comme, par exemple:

def login_success arg 
    raise Exception.new('Argument not a Hash...') unless arg.is_a? Hash 
    # Your code here 
end 
5

Avec l'avènement des arguments mot-clé dans Ruby 2.0 vous pouvez maintenant faire

def login_success(msg:"Default", gotourl:"http://example.com") 
    puts msg 
    redirect_to gotourl 
end 

Dans Ruby 2.1 vous pouvez laisser les valeurs par défaut,

def login_success(msg:, gotourl:) 
    puts msg 
    redirect_to gotourl 
end 

Lorsqu'elle est appelée, l'omission d'un paramètre qui n'a pas de valeur par défaut déclenche un

+2

Vous pourriez également mentionner que vous pouvez omettre les valeurs par défaut dans Ruby 2.1 pour rendre les paramètres requis, par ex. 'def login_success (msg :, gotourl:)' entraînera une erreur si vous essayez d'appeler 'login_success' sans que les paramètres' msg' et 'gotourl' ne soient spécifiés. – Ajedi32

Questions connexes