À l'aide de faire bloc vs accolades {}
Nouveau à ruby, mettre sur votre newbie gants.
Est là toute la différence (obscur ou pratique) entre les deux extraits?
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 me rends compte de l'attache de la syntaxe devrait vous permettre de placer le bloc sur une ligne
my_array.each { |item| puts item }
mais en dehors de ça, y a des raisons impérieuses d'utiliser une syntaxe plus de l'autre?
- Grande question. Je suis aussi intéressé par ce que l'expérience rubyists préférez.
- Dupliquer: stackoverflow.com/questions/533008
- double possible de stackoverflow.com/questions/533008/...
- C'est un doublon de Ruby Bloc d'Erreur de Syntaxe, bloc de Code transmis à
each
travaille avec des crochets, mais pas avecdo
-end
(ruby), Bloc de définition de la différence entre les accolades et lesdo
-end
?, Ruby multiligne bloc sansdo
end
, Quelle est la différence ou de la valeur de ces blocs de codage styles en Ruby? et Ruby bloc et sans parenthèse arguments. - Vous pouvez également écrire une seule ligne de le faire bloc même si c'est vraiment utile quand on fait quelque chose comme eval("my_array.chaque faire |item|;met élément;fin"), mais il fonctionne à l'irb ou à levier sans eval et les guillemets que Vous pouvez venir à travers une situation où c'est l'option préférée. Ne me demandez pas quand mais. C'est un autre sujet étudié.
- ai-je vraiment besoin de le FAIRE mot-clé?
- Double Possible de faire..fin vs accolades pour les blocs en Ruby
Vous devez vous connecter pour publier un commentaire.
Ruby livre de recettes dit support de la syntaxe a une priorité plus élevée afin que
do..end
Deuxième exemple ne fonctionne que lorsque les parenthèses est utilisé,
1.upto(3) { |x| puts x }
C'est un peu vieux, mais je voudrais 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ée avec le bloc de
do..end
et method2 sera transmis à method1 comme argument! ce qui est équivalent àmethod1(method2){ puts "hi" }
mais si vous dites
puis method2 seront appelés avec le bloc alors la valeur retournée sera transmis à method1 comme argument. Ce qui est équivalent à
method1(method2 do puts "hi" end)
#### sortie ####
Généralement, la convention est d'utiliser
{}
lorsque vous effectuez une opération de petite taille, par exemple, un appel de méthode ou d'un titre de comparaison, etc. donc c'est parfaitement logique:Mais si vous avez un peu complexe logique qui va à plusieurs lignes puis utilisez
do .. end
comme:Fondamentalement, il vient, si votre bloc logique va à lignes multiples et ne peuvent pas être installés sur la même ligne, l'utilisation
do .. end
et si votre bloc logique est simple et juste un simple/simple ligne de code, puis utiliser{}
.result_with_some_condition = method{|c| c.do_something || whateever}; result_with_some_condition.another_method
en tant qu'il fait juste un peu plus facilement compréhensible. Mais en général, je voudrais éviter un accident de train.Il y a deux styles pour choisir
do end
vs{ }
pour les blocs en Ruby:Le premier et très bon style a été popularisé par Ruby on Rails, et est basé sur une règle simple de simple contre multi-ligne:
{ }
pour une seule ligne de blocsdo end
pour le multi-blocs de lignesCela a un sens parce que faire/fin de lit mal dans un one-liner, mais pour le multi-blocs de lignes, en laissant une clôture
}
accroché sur sa propre ligne est incompatible avec tout le reste qui utiliseend
en ruby, telles que le module, classe & les définitions de méthode (def
etc.) et des structures de contrôle (if
,while
,case
, etc.)La deuxième, moins fréquemment vu le style est connu comme la sémantique, ou "Weirich Accolades", proposé par la fin, une grande rubyist Jim Weirich:
do end
de procédure blocs{ }
pour les blocs fonctionnelsCela signifie que lorsque le bloc est évalué pour son valeur de retour, il devrait être chainable, et la
{}
accolades plus de sens pour le chaînage de méthode.D'autre part, lorsque le bloc est évalué pour son effets secondaires, alors la valeur de retour est sans conséquence, et le bloc est juste "faire" quelque chose, de sorte qu'il ne fait pas de sens d'être enchaînés.
Cette distinction dans la syntaxe transmet visual sens au sujet de l'évaluation de la bloquer, et si oui ou non vous devriez vous préoccuper de sa valeur de retour.
Par exemple, ici, la valeur de retour du bloc est appliqué à chaque élément:
Cependant, ici, il n'est pas en utilisant le bloc de valeur de retour. Il fonctionne sur le plan procédural, et faire un des effets secondaires avec elle:
Un autre avantage de la sémantique du style, c'est que vous n'avez pas besoin de changer des accolades à faire/à la fin juste parce qu'une ligne a été ajoutée au bloc.
Comme une observation, comme par hasard fonctionnelle blocs sont souvent un one-liner, et de procédure blocs (par exemple config) sont multi-ligne. Ainsi, à la suite de la Weirich style finit par regarder presque la même que les Rails de style.
J'ai utilisé le Weirich style depuis des années, mais seulement éloigné de ce à toujours utiliser des accolades. Je ne me souviens pas d'avoir jamais utilisé les informations provenant du bloc de style, et la définition est un peu vague. Par exemple:
Sont ces procudual ou fonctionnelle?
Et le nombre de lignes, c'est inutile à mon avis. Je sais, qu'il y ait 1 ou plusieurs lignes, et exactement pourquoi devrais-je changer de style, juste parce que j'ai ajouté ou supprimé des lignes?