Neu bei Ruby, zieh deine Newbie-Handschuhe an.
Gibt es einen Unterschied (dunkel oder praktisch) zwischen den folgenden beiden Ausschnitten?
my_array = [:uno, :dos, :tres]
my_array.each { |item|
puts item
}
my_array = [:uno, :dos, :tres]
my_array.each do |item|
puts item
end
Mir ist klar, dass Sie mit der Klammer-Syntax den Block in einer Zeile platzieren können
my_array.each { |item| puts item }
Aber gibt es darüber hinaus zwingende Gründe, eine Syntax über die andere zu verwenden?
ruby
coding-style
Alan Storm
quelle
quelle
each
Klammern übergeben wird, aber nicht mitdo
-end
(Ruby) , Blockdefinition - Unterschied zwischen geschweiften Klammern unddo
-end
? , Ruby mehrzeiliger Block ohnedo
end
, Was ist der Unterschied oder Wert dieser Blockcodierungsstile in Ruby? und Ruby-Block und nicht parenthesierte Argumente .Antworten:
Laut Ruby-Kochbuch hat die Klammernsyntax eine höhere Rangfolge als
do..end
Das zweite Beispiel funktioniert nur, wenn Klammern verwendet werden.
1.upto(3) { |x| puts x }
quelle
Dies ist eine etwas alte Frage, aber ich möchte versuchen, etwas mehr über
{}
und zu erklärendo .. end
wie es schon gesagt wird
aber wie macht dieser Unterschied:
In diesem Fall wird Methode1 mit dem Block von
do..end
aufgerufen und Methode2 wird als Argument an Methode1 übergeben! das ist äquivalent zumethod1(method2){ puts "hi" }
aber wenn du sagst
dann wird method2 mit dem Block aufgerufen, dann wird der zurückgegebene Wert als Argument an method1 übergeben. Welches ist gleichbedeutend mit
method1(method2 do puts "hi" end)
#### Ausgabe ####
quelle
Im Allgemeinen wird die Konvention verwendet,
{}
wenn Sie eine kleine Operation ausführen, z. B. einen Methodenaufruf oder einen Vergleich usw., sodass dies durchaus sinnvoll ist:Wenn Sie jedoch eine etwas komplexe Logik haben, die mehrere Zeilen umfasst, verwenden Sie
do .. end
Folgendes:Grundsätzlich kommt es darauf an, ob Ihre Blocklogik mehrere Zeilen umfasst und nicht in dieselbe Zeile eingepasst werden kann,
do .. end
und wenn Ihre Blocklogik einfach ist und nur eine einfache / einzelne Codezeile verwendet wird{}
.quelle
result_with_some_condition = method{|c| c.do_something || whateever}; result_with_some_condition.another_method
da dies nur ein bisschen verständlicher macht. Aber im Allgemeinen würde ich ein Zugunglück vermeiden.In Ruby gibt es zwei gängige Stile für die Auswahl im
do end
Vergleich{ }
zu Blöcken:Der erste und sehr verbreitete Stil wurde von Ruby on Rails populär gemacht und basiert auf einer einfachen Regel von ein- oder mehrzeilig:
{ }
für einzeilige Blöckedo end
für mehrzeilige BlöckeDies ist sinnvoll, da do / end in einem Einzeiler schlecht gelesen wird. Bei mehrzeiligen Blöcken ist es jedoch nicht konsistent, einen Abschluss
}
in einer eigenen Zeile hängen zu lassen, wasend
in Ruby verwendet wird, z. B. Modul-, Klassen- und Methodendefinitionen (def
usw.) .) und Kontrollstrukturen (if
,while
,case
, etc.)Der zweite, weniger häufig gesehene Stil ist als semantische oder " Weirich Braces " bekannt, die vom verstorbenen, großen Rubinisten Jim Weirich vorgeschlagen wurde:
do end
für Verfahrensblöcke{ }
für FunktionsblöckeDies bedeutet, dass der Block, wenn er auf seinen Rückgabewert bewertet wird , verkettbar sein sollte und die
{}
geschweiften Klammern für die Methodenverkettung sinnvoller sind.Auf der anderen Seite, wenn der Block für seine ausgewertet wird Nebenwirkungen untersucht wird , hat der Rückgabewert keine Konsequenz, und der Block "tut" nur etwas, so dass es keinen Sinn macht, verkettet zu werden.
Diese Unterscheidung in der Syntax vermittelt eine visuelle Bedeutung für die Auswertung des Blocks und ob Sie sich um seinen Rückgabewert kümmern sollten oder nicht.
Hier wird beispielsweise der Rückgabewert des Blocks auf jedes Element angewendet:
Hier wird jedoch nicht der Rückgabewert des Blocks verwendet. Es arbeitet prozedural und dabei einen Nebeneffekt mit sich:
Ein weiterer Vorteil des semantischen Stils besteht darin, dass Sie keine geschweiften Klammern für do / end ändern müssen, nur weil dem Block eine Zeile hinzugefügt wurde.
Als Beobachtung sind zufällig funktionale Blöcke häufig einzeilig , und prozedurale Blöcke (z. B. config) sind mehrzeilig. Wenn Sie also dem Weirich-Stil folgen, sehen Sie fast genauso aus wie dem Rails-Stil.
quelle
Ich habe jahrelang den Weirich-Stil verwendet, mich aber davon entfernt, um immer Zahnspangen zu verwenden . Ich erinnere mich nicht, jemals die Informationen aus dem Blockstil verwendet zu haben, und die Definition ist irgendwie vage. Beispielsweise:
Sind diese prokudual oder funktional?
Und die Sache mit der Zeilenanzahl ist meiner Meinung nach einfach nutzlos. Ich weiß, ob es 1 oder mehr Zeilen gibt und warum genau sollte ich den Stil ändern, nur weil ich Zeilen hinzugefügt oder entfernt habe?
quelle