58 votes

Créer un rubis de fonction qui accepte un hachage de paramètres

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

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

Qu'est-ce que le prototype d'une fonction qui accepte ce genre de paramètres? Comment puis-je les lire?

Merci à l'avance!

63voto

Allyn Points 6568

Si vous passer des paramètres à un Rubis de la fonction de hachage de la syntaxe, Ruby va supposer que c'est votre but. Donc:

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

32voto

scottd Points 4120

Un truc important à retenir est que vous ne pouvez faire la syntaxe lorsque vous quittez le hachage de caractères {}, si le paramètre de hachage est le dernier paramètre de la fonction. De sorte que vous pouvez faire ce que Allyn a fait, et qui va travailler. 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 hash n'est pas le dernier paramètre que vous avez à entourer le hachage des éléments avec des {}.

5voto

CCD Points 116

Utiliser un seul argument. Ruby va transformer la nommée des valeurs dans une table de 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 une table de hachage, au lieu de la valeur par défaut ruby duck-typing, alors vous auriez besoin de contrôle. 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

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