Nouveau sur ruby, mettez vos gants pour débutants.
Y a-t-il une différence (obscure ou pratique) entre les deux extraits de code suivants?
my_array = [:uno, :dos, :tres]
my_array.each { |item|
puts item
}
my_array = [:uno, :dos, :tres]
my_array.each do |item|
puts item
end
Je réalise que la syntaxe d'accolade vous permettrait de placer le bloc sur une seule ligne
my_array.each { |item| puts item }
mais en dehors de cela, y a-t-il des raisons impérieuses d'utiliser une syntaxe plutôt qu'une autre?
ruby
coding-style
Alan Storm
la source
la source
each
fonctionne avec des crochets mais pas avecdo
-end
(ruby) , la définition du bloc - différence entre les accolades etdo
-end
? , Bloc multiligne Ruby sansdo
end
, Quelle est la différence ou la valeur de ces styles de codage de bloc dans Ruby? et Ruby block et arguments sans parenthèse .Réponses:
Le livre de recettes Ruby indique que la syntaxe des crochets a un ordre de priorité plus élevé que
do..end
Le deuxième exemple ne fonctionne que lorsque les parenthèses sont utilisées,
1.upto(3) { |x| puts x }
la source
C'est une question un peu ancienne mais j'aimerais essayer d'expliquer un peu plus sur
{}
etdo .. end
comme il est dit avant
mais comment celui-ci fait la différence:
dans ce cas, method1 sera appelé avec le bloc de
do..end
et method2 sera passé à method1 comme argument! ce qui équivaut àmethod1(method2){ puts "hi" }
mais si tu dis
puis method2 sera appelée avec le bloc puis la valeur retournée sera transmise à method1 comme argument. Ce qui équivaut à
method1(method2 do puts "hi" end)
#### production ####
la source
Généralement, la convention est à utiliser
{}
lorsque vous effectuez une petite opération, par exemple, un appel de méthode ou une comparaison, etc.Mais si vous avez une logique légèrement complexe qui va sur plusieurs lignes, utilisez
do .. end
comme:Fondamentalement, cela se résume à, si votre logique de bloc va sur plusieurs lignes et ne peut pas être installée sur la même ligne, utilisez
do .. end
et si votre logique de bloc est simple et juste une simple / seule ligne de code, utilisez{}
.la source
result_with_some_condition = method{|c| c.do_something || whateever}; result_with_some_condition.another_method
car cela le rend un peu plus facilement compréhensible. Mais en général, j'éviterais un accident de train.Il existe deux styles courants pour choisir
do end
ou{ }
pour les blocs dans Ruby:Le premier style très courant a été popularisé par Ruby on Rails, et est basé sur une règle simple de simple vs multi-ligne:
{ }
pour les blocs sur une seule lignedo end
pour les blocs multilignesCela a du sens car do / end se lit mal dans un one-liner, mais pour les blocs multi-lignes, laisser une fermeture
}
suspendue sur sa propre ligne est incompatible avec tout ce qui utiliseend
dans ruby, comme les définitions de module, de classe et de méthode (def
etc. .) et des structures de commande (if
,while
,case
, etc.)Le deuxième style, moins fréquemment vu, est connu sous le nom de sémantique, ou " Weirich Braces ", proposé par le regretté grand rubisiste Jim Weirich:
do end
pour les blocs procéduraux{ }
pour les blocs fonctionnelsCela signifie que lorsque le bloc est évalué pour sa valeur de retour , il doit être chaînable et les
{}
accolades ont plus de sens pour le chaînage de méthodes.D'un autre côté, lorsque le bloc est évalué pour ses effets secondaires , alors la valeur de retour n'a aucune conséquence, et le bloc "fait" simplement quelque chose, donc cela n'a pas de sens d'être enchaîné.
Cette distinction dans la syntaxe donne une signification visuelle à l'évaluation du bloc et indique si vous devez ou non vous soucier de sa valeur de retour.
Par exemple, ici, la valeur de retour du bloc est appliquée à chaque élément:
Cependant, ici, il n'utilise pas la valeur de retour du bloc. Il est de fonctionnement de la procédure, et faire un effet secondaire avec elle:
Un autre avantage du style sémantique est que vous n'avez pas besoin de changer d'accolades pour faire / terminer simplement parce qu'une ligne a été ajoutée au bloc.
En guise d' observation, les blocs fonctionnels par coïncidence sont souvent une seule ligne, et les blocs procéduraux (par exemple config) sont multilignes. Ainsi, suivre le style Weirich finit par ressembler presque au style Rails.
la source
J'ai utilisé le style Weirich pendant des années, mais je m'en suis éloigné pour toujours utiliser des accolades . Je ne me souviens pas avoir jamais utilisé les informations du style de bloc, et la définition est un peu vague. Par exemple:
Sont-ils procuduels ou fonctionnels?
Et la chose du nombre de lignes est tout simplement inutile à mon avis. Je sais s'il y a une ou plusieurs lignes et pourquoi devrais-je modifier le style simplement parce que j'ai ajouté ou supprimé des lignes?
la source