27 votes

Quelle est la différence ou la valeur de ces styles de codage de blocs dans Ruby?

Quel style est préféré? Y a-t-il une bonne raison pour l'un contre l'autre?

Merci d'avance!

 1) cmds.each do |cmd|
   end

2) cmds.each { |cmd|
   }
 

Exemple de code:

 cmds = [ "create", "update", "list", "help" ]

# Block style one
#
cmds.each do |cmd|
  puts "loop1, cmd: #{cmd}"
end

# Block style two
#
cmds.each { |cmd|
  puts "loop2, cmd: #{cmd}"
}
 

32voto

Gordon Wilson Points 14721

L'équipe des rails et de nombreux autres rubis préfèrent utiliser des accolades bouclés pour les blocs d'une ligne et do...end pour les blocs multilignes.

La seule différence fonctionnelle entre les deux est que la priorité d'un bloc do...end est inférieure à celle d'un bloc {...} .

20voto

Mike Woodhouse Points 27748

Selon la "Pioche" livre (je suis à la recherche lors de la 2e édition ici), Gordon est correct: la seule différence est la priorité:

p.356 (mes italiques) :

Les accolades ont une priorité élevée; do a une faible priorité. Si la méthode invocation a des paramètres qui ne sont pas entre parenthèses, la brace forme d'un bloc va se lier à la dernière paramètre, et non pas à l'ensemble de la invocation. L' do formulaire de lier pour l'invocation.

Voir aussi p.168 pour un exemple.

12voto

nimrodm Points 9191

Les deux formes sont équivalentes.

Le style recommandé est d'utiliser les accolades pour une ligne de blocs et d'utiliser le "faire"-"fin" pour multi-blocs.

Edit: Austin Ziegler a souligné (dans le commentaire ci-dessous) que les deux formes ont la différence de niveaux de priorité: accolades ont une priorité plus élevée. Par conséquent, lors de l'appel d'une méthode sans parenthèse un bloc entre {} peut se lier à la dernière argument au lieu de la méthode appelante.

L'exemple suivant a été proposé par Austin:

def foo
    yield
end

puts foo { "hello" }

puts foo do
    "hello"
end

Le premier "met" imprime "bonjour": foo est appelé le retour "bonjour" qui est l'argument de vente.

La deuxième bails avec une erreur:

in `foo': no block given

Puisque dans ce cas la ne de fin de bloc se lie à la met méthode.

Merci encore à Austin pour dégager cette place.

10voto

nerdz Points 101

La réponse de Gordon est "la Voie Rubis", et bien qu'il soit courant de mettre une ligne entre accolades, ce n'est pas obligatoire.

Notez également la facilité avec laquelle on peut agir sur la valeur résultante:

 cmds.each do |cmd| cmd.upcase! end.sort

# Now, cmds = ["CREATE", "HELP", "LIST", "UPDATE"]
 

Bien que vous puissiez déjà voir comment {} est plus lisible ici, et donc préféré si quelqu'un d'autre va voir votre code:

 cmds.each { |cmd| cmd.upcase! }.sort
 

2voto

Chuck Points 138930

Le plus souvent, le style 1 est utilisé pour les blocs à plusieurs lignes et le style 2 est utilisé pour les lignes simples.

La syntaxe do…end ressemble étroitement à d'autres structures de contrôle Ruby (if, def, class), donc l'utilisation de cela pour les blocs conserve l'apparence de votre code cohérente et claire. Mais cela ne fonctionne pas bien pour les monolignes, c'est pourquoi la version entre parenthèses y est préférée.

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