Ich habe einen Kollegen, der aktiv versucht, mich davon zu überzeugen, dass ich do..end nicht verwenden und stattdessen geschweifte Klammern zum Definieren mehrzeiliger Blöcke in Ruby verwenden sollte.
Ich bin fest im Lager, nur geschweifte Klammern für kurze Einzeiler zu verwenden und für alles andere zu tun. Aber ich dachte, ich würde mich an die größere Gemeinschaft wenden, um eine Lösung zu finden.
Also was ist es und warum? (Beispiel eines Sollte-Codes)
context do
setup { do_some_setup() }
should "do somthing" do
# some more code...
end
end
oder
context {
setup { do_some_setup() }
should("do somthing") {
# some more code...
}
}
Persönlich beantwortet ein Blick auf das Obige die Frage für mich, aber ich wollte dies für die größere Gemeinschaft öffnen.
ruby-on-rails
ruby
ruby-on-rails-3
coding-style
Blake Taylor
quelle
quelle
Antworten:
Die allgemeine Konvention besteht darin, do..end für mehrzeilige Blöcke und geschweifte Klammern für einzeilige Blöcke zu verwenden. Es gibt jedoch auch einen Unterschied zwischen den beiden, der anhand dieses Beispiels veranschaulicht werden kann:
Dies bedeutet, dass {} eine höhere Priorität hat als do..end. Denken Sie also daran, wenn Sie entscheiden, was Sie verwenden möchten.
PS: Ein weiteres Beispiel, das Sie berücksichtigen sollten, wenn Sie Ihre Vorlieben entwickeln.
Der folgende Code:
bedeutet wirklich:
Und dieser Code:
bedeutet wirklich:
Um die gewünschte Definition mit geschweiften Klammern zu erhalten, müssen Sie Folgendes tun:
Vielleicht möchten Sie sowieso Klammern für Parameter verwenden, aber wenn Sie dies nicht tun, ist es wahrscheinlich am besten, do..end in diesen Fällen zu verwenden, um diese Verwirrung zu vermeiden.
quelle
puts [1,2,3].map do |k| k+1; end
druckt nur der Enumerator dh eine Sache. Wird hier nicht zwei Argumente übergeben, nämlich[1,2,3].map
unddo |k| k+1; end
?Aus der Programmierung von Ruby :
Also der Code
Bindet den Block
param
während des Codes an die VariableBindet den Block an die Funktion
f
.Dies ist jedoch kein Problem, wenn Sie Funktionsargumente in Klammern setzen.
quelle
Es gibt ein paar Gesichtspunkte dazu, es ist wirklich eine Frage der persönlichen Präferenz. Viele Rubinisten gehen so vor, wie Sie es tun. Zwei andere übliche Stile sind jedoch, immer den einen oder anderen zu verwenden oder
{}
für Blöcke, die Werte zurückgeben, unddo ... end
für Blöcke, die für Nebenwirkungen ausgeführt werden.quelle
Geschweifte Klammern haben einen großen Vorteil: Viele Editoren haben eine VIEL einfachere Möglichkeit, sie abzugleichen, was bestimmte Arten des Debuggens erheblich vereinfacht. In der Zwischenzeit ist das Schlüsselwort "do ... end" etwas schwieriger zu finden, zumal "end" auch mit "if" übereinstimmen.
quelle
do ... end
Schlüsselwörter standardmäßigdo ... end
ein Sonderfall ist, der eine sprachspezifische Logik erfordert.Die häufigste Regel, die ich gesehen habe (zuletzt in Eloquent Ruby ), lautet:
quelle
Ich stimme für do / end
Die Konvention gilt
do .. end
für mehrzeilige und{ ... }
einzeilige.Aber ich mag es
do .. end
besser, also wenn ich einen Einzeiler habe, benutze ich ihndo .. end
trotzdem, aber formatiere ihn wie gewohnt für do / end in drei Zeilen. Das macht alle glücklich.Ein Problem dabei
{ }
ist, dass es dem Poetry-Modus feindlich gegenübersteht (weil sie eng an den letzten Parameter und nicht an den gesamten Methodenaufruf gebunden sind, also müssen Sie Methoden-Parens einschließen) und meiner Meinung nach einfach nicht so gut aussehen. Sie sind keine Anweisungsgruppen und stoßen aus Gründen der Lesbarkeit mit Hash-Konstanten zusammen.Außerdem habe ich genug von
{ }
C-Programmen gesehen. Rubys Weg ist wie immer besser. Es gibt genau einenif
Blocktyp, und Sie müssen niemals zurückgehen und eine Anweisung in eine zusammengesetzte Anweisung konvertieren.quelle
do_stuff if x==1
), dessen Konvertierung in die reguläre Syntax etwas ärgerlich ist. Aber das ist eine andere Diskussion.if
, Postfixif
, Postfixunless
(auch eine Artif
, ein Wenn-nicht) und eine Zeileif
mitthen
. Der Ruby-Weg besteht darin, viele Möglichkeiten zu haben, um tatsächlich etwas auszudrücken, das immer dasselbe ist, viel schlimmer als das, was C anbietet, das sehr einfachen, strengen Regeln folgt.Einige einflussreiche Rubyisten schlagen vor, geschweifte Klammern zu verwenden, wenn Sie den Rückgabewert verwenden, und do / end, wenn Sie dies nicht tun.
http://talklikeaduck.denhaven2.com/2007/10/02/ruby-blocks-do-or-brace (auf archive.org)
http://onestepback.org/index.cgi/Tech/Ruby/BraceVsDoEnd.rdoc (auf archive.org)
Dies scheint im Allgemeinen eine gute Praxis zu sein.
Ich würde dieses Prinzip ein wenig ändern, um zu sagen, dass Sie die Verwendung von do / end in einer einzelnen Zeile vermeiden sollten, da es schwieriger zu lesen ist.
Sie müssen bei der Verwendung von geschweiften Klammern vorsichtiger sein, da diese anstelle des gesamten Methodenaufrufs an den endgültigen Parameter einer Methode gebunden werden. Fügen Sie einfach Klammern hinzu, um dies zu vermeiden.
quelle
Eigentlich ist es eine persönliche Präferenz, aber nachdem ich gesagt habe, dass ich in den letzten 3 Jahren meiner Rubinerfahrungen gelernt habe, dass Rubin seinen Stil hat.
Ein Beispiel wäre, wenn Sie aus einem JAVA-Hintergrund kommen, eine boolesche Methode, die Sie möglicherweise verwenden
Beachten Sie den Kamelfall und meistens das Präfix 'is', um ihn als boolesche Methode zu identifizieren.
Aber in der Rubinwelt wäre die gleiche Methode
Ich persönlich denke, es ist besser, mit 'Ruby Way' zu arbeiten (aber ich weiß, dass es einige Zeit dauert, bis man es versteht (es hat ungefähr 1 Jahr gedauert: D)).
Schließlich würde ich mit gehen
Blöcke.
quelle
Ich habe eine andere Antwort gegeben, obwohl bereits auf den großen Unterschied hingewiesen wurde (Vorrang / Bindung), und dies kann zu schwer zu findenden Problemen führen (der Blechmann und andere haben darauf hingewiesen). Ich denke, mein Beispiel zeigt das Problem mit einem nicht so üblichen Code-Snippet, selbst erfahrene Programmierer lesen nicht wie am Sonntag:
Dann habe ich Code verschönert ...
Wenn Sie das
{}
hier in ändern ,do/end
wird der Fehler angezeigt, diese Methodetranslate
existiert nicht ...Warum dies geschieht, wird hier mehr als einmal hervorgehoben. Aber wo soll man hier Zahnspangen anbringen? (@the Tin Man: Ich benutze immer Zahnspangen, wie Sie, aber hier ... beaufsichtigt)
so mag jede antwort
ist einfach falsch, wenn es ohne "ABER Behalte Klammern / Vorrang!"
nochmal:
und
(Was auch immer das Ergebnis von Extend mit dem Block macht ...)
Wenn Sie also do / end verwenden möchten, verwenden Sie Folgendes:
quelle
Aufgrund persönlicher Vorurteile bevorzuge ich geschweifte Klammern gegenüber einem Do / End-Block, da dies für eine höhere Anzahl von Entwicklern verständlicher ist, da die meisten Hintergrundsprachen sie gegenüber der Do / End-Konvention verwenden. Wenn dies gesagt wird, besteht der eigentliche Schlüssel darin, eine Einigung in Ihrem Shop zu erzielen. Wenn do / end von 6/10 Entwicklern verwendet wird, als JEDER sie verwenden sollte. Wenn 6/10 geschweifte Klammern verwenden, halten Sie sich an dieses Paradigma.
Es geht darum, ein Muster zu erstellen, damit das gesamte Team die Codestrukturen schneller identifizieren kann.
quelle
Es gibt einen subtilen Unterschied zwischen ihnen, aber {} bindet enger als do / end.
quelle
Mein persönlicher Stil ist es, die Lesbarkeit gegenüber starren Regeln der
{
...}
gegendo
...end
Wahl zu betonen , wenn eine solche Wahl möglich ist. Meine Vorstellung von Lesbarkeit lautet wie folgt:In komplexeren Syntaxen, wie z. B. mehrzeiligen verschachtelten Blöcken, versuche ich,
{
...}
unddo
...end
Trennzeichen für das natürlichste Ergebnis zu verteilen , z.Obwohl das Fehlen starrer Regeln für verschiedene Programmierer zu leicht unterschiedlichen Auswahlmöglichkeiten führen kann, glaube ich, dass die Optimierung der Lesbarkeit von Fall zu Fall, obwohl subjektiv, ein Nettogewinn gegenüber der Einhaltung starrer Regeln ist.
quelle
Ruby
sei die beste pragmatische Sprache da draußen. Soll ich Skriptsprache sagen. Heute denke ich, dass Sie genauso gut lernen könnenBrainfuck
.Ich habe hier ein Beispiel für die am häufigsten gewählte Antwort genommen. Sagen,
Wenn Sie überprüfen, welche interne Implementierung in array.rb vorhanden ist, lautet der Header der Map-Methode :
Invokes the given block once for each element of self.
dh es akzeptiert einen Codeblock - was auch immer zwischen do und end liegt, wird als Yield ausgeführt. Dann wird das Ergebnis wieder als Array gesammelt, sodass ein völlig neues Objekt zurückgegeben wird.
quelle
Es gibt eine dritte Option: Schreiben Sie einen Präprozessor, um aus der Einrückung auf "Ende" in einer eigenen Zeile zu schließen. Die tiefen Denker, die prägnanten Code bevorzugen, haben zufällig Recht.
Besser noch, Hack Ruby, das ist eine Flagge.
Natürlich besteht die einfachste Lösung für "Pick your Fights" darin, die Stilkonvention zu übernehmen, dass eine Folge von Enden alle in derselben Zeile erscheint, und Ihre Syntaxfarbe beizubringen, um sie stummzuschalten. Zur Erleichterung der Bearbeitung könnten Editor-Skripte verwendet werden, um diese Sequenzen zu erweitern / zu reduzieren.
20% bis 25% meiner Ruby-Codezeilen sind "Ende" in ihrer eigenen Zeile, was durch meine Einrückungskonventionen trivial abgeleitet wird. Ruby ist die lispelartige Sprache, die den größten Erfolg erzielt hat. Wenn Leute dies bestreiten und fragen, wo all die schrecklichen Klammern sind, zeige ich ihnen eine Rubinfunktion, die in sieben Zeilen überflüssigen "Endes" endet.
Ich habe jahrelang mit einem Lisp-Präprozessor codiert, um auf die meisten Klammern zu schließen: Ein Balken '|' öffnete eine Gruppe, die am Ende der Zeile automatisch geschlossen wurde, und ein Dollarzeichen '$' diente als leerer Platzhalter, an dem sonst keine Symbole vorhanden wären, um auf die Gruppierungen schließen zu können. Dies ist natürlich religiöses Kriegsgebiet. Lisp / Schema ohne Klammern ist die poetischste aller Sprachen. Es ist jedoch einfacher, Klammern mithilfe der Syntaxfarbe einfach zu beruhigen.
Ich codiere immer noch mit einem Präprozessor für Haskell, um Heredocs hinzuzufügen und alle bündigen Zeilen als Kommentare festzulegen, alles wird als Code eingerückt. Ich mag keine Kommentarzeichen, egal in welcher Sprache.
quelle