3 votes

Puis-je mettre le hash comme premier paramètre dans la méthode ?

Je suis en train d'apprendre Ruby, et je rencontre un problème.

Voici le code que j'ai écrit.

class Customer
  def puts_result(name, addr)
    return name, addr
  end
end

aaron = Customer.new
puts aaron.puts_result "Aaron", {country: "Taiwan", city: "Tainan"}
puts aaron.puts_result "Aaron", country: "Taiwan", city: "Tainan"
puts aaron.puts_result {country: "Taiwan", city: "Tainan"}, "Aaron"

J'appelle la méthode puts_result et je passe les paramètres de trois manières différentes.

Dans la première façon, j'ai passé le hachage avec des accolades, et cela fonctionne bien. Dans la deuxième façon, j'ai passé le hachage sans accolades, et cela fonctionne toujours bien.

Le problème est que dans la troisième méthode, j'ai passé le hachage comme premier paramètre avec des accolades, mais cela renvoie une erreur.

(repl):15 : erreur de syntaxe, unexpected ':', expecting '}' puts aaron.puts_result {pays : "Taiwan", ville : "Tainan"}, "Aaron" (repl):15 : erreur de syntaxe, inattendu ',', attendu '}' puts aaron.puts_result {pays : "Taiwan", city : "Tainan"}, "Aaron"

Y a-t-il quelque chose dans mon imprudence ?

2voto

Holger Just Points 17345

L'erreur se produit dans votre troisième appel

puts aaron.puts_result {country: "Taiwan", city: "Tainan"}, "Aaron"

Ici, il y a une ambiguïté syntaxique lors de l'analyse de l'accolade d'ouverture. Il peut s'agir soit du début d'un hachage (ce qui est votre intention), soit du début d'un bloc transmis à la méthode.

L'analyseur syntaxique de Ruby suppose toujours qu'une accolade ouvrante après une méthode signale le début d'un bloc, sauf si vous mettez l'argument entre parenthèses explicites. Cela résoudrait alors l'ambiguïté puisqu'un bloc n'est jamais déclaré à l'intérieur des parenthèses mais toujours à l'extérieur.

Avec votre code, vous pouvez donc résoudre l'ambiguïté comme suit :

puts aaron.puts_result({country: "Taiwan", city: "Tainan"}, "Aaron")

Pour en tirer une règle reproductible : n'oubliez jamais d'utiliser des paranthèses autour des appels de méthode lorsque le premier argument est un hachage littéral avec des accolades.

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