Gibt es eine Möglichkeit, dies ein wenig besser aussehen zu lassen?
conn.exec 'select attr1, attr2, attr3, attr4, attr5, attr6, attr7 ' +
'from table1, table2, table3, etc, etc, etc, etc, etc, ' +
'where etc etc etc etc etc etc etc etc etc etc etc etc etc'
Gibt es eine Möglichkeit, eine Verkettung zu implizieren?
ruby
code-formatting
Zombies
quelle
quelle
Antworten:
Es gibt Teile dieser Antwort, die mir geholfen haben, das zu bekommen, was ich brauchte (einfache mehrzeilige Verkettung OHNE zusätzliches Leerzeichen), aber da keine der tatsächlichen Antworten dies hatte, kompiliere ich sie hier:
Als Bonus gibt es hier eine Version mit lustiger HEREDOC-Syntax (über diesen Link ):
Letzteres gilt hauptsächlich für Situationen, die mehr Flexibilität bei der Verarbeitung erfordern. Ich persönlich mag es nicht, es bringt die Verarbeitung an einen seltsamen Ort für den String (dh davor, aber mit Instanzmethoden, die normalerweise danach kommen), aber es ist da. Beachten Sie, dass Sie beim Einrücken des letzten
END_SQL
Bezeichners (was häufig vorkommt, da dieser wahrscheinlich in einer Funktion oder einem Modul enthalten ist) die Syntax mit Bindestrich verwenden müssen (dhp <<-END_SQL
anstelle vonp <<END_SQL
). Andernfalls wird der Bezeichner durch das Leerzeichen beim Einrücken als Fortsetzung der Zeichenfolge interpretiert.Das spart nicht viel Tippen, sieht aber für mich besser aus als die Verwendung von + Zeichen.
Wenn Sie Ruby 2.3+ verwenden (ich sage in einer Bearbeitung einige Jahre später), ist auch der Operator << ~ verfügbar , der zusätzliche Einrückungen aus der endgültigen Zeichenfolge entfernt.
.gsub
In diesem Fall sollten Sie in der Lage sein, den Aufruf zu entfernen (obwohl dies möglicherweise sowohl vom Starteinzug als auch von Ihren endgültigen Anforderungen abhängt).BEARBEITEN: Hinzufügen eines weiteren:
quelle
p <<END_SQL
sollte seinp <<-END_SQL
Andernfalls ist dies die Antwort. Optional können Sie führende Leerzeichen mit dem schnörkellosen HEREDOC-Operator<<~END_SQL
<<~
wäre schön, die Antwort zu ergänzen, und das von dort aus zu untersuchen. Persönlich benutze ich das,<<~MSG.strip ... MSG
was auch das letzte abstreift\n
.In Ruby 2.0 können Sie jetzt einfach verwenden
%
Zum Beispiel:
quelle
squish
der Ausgabe hilfreich sein.Ja, wenn Ihnen die zusätzlichen Zeilenumbrüche nichts ausmachen:
Alternativ können Sie einen Heredoc verwenden :
quelle
%Q(...)
%(...)
Wie Sie bereits gelesen haben, gibt es mehrere Syntaxen für mehrzeilige Zeichenfolgen. Mein Favorit ist Perl-Stil:
Die mehrzeilige Zeichenfolge beginnt mit% q, gefolgt von einem {, [oder (und endet dann mit dem entsprechenden umgekehrten Zeichen.% Q erlaubt keine Interpolation;% Q erlaubt dies, sodass Sie Folgendes schreiben können:
Ich habe eigentlich keine Ahnung, wie diese Arten von mehrzeiligen Zeichenfolgen genannt werden, also nennen wir sie einfach Perl-mehrzeilig.
Beachten Sie jedoch, dass Sie möglicherweise unnötige Leerzeichen erhalten, unabhängig davon, ob Sie Perl-Multilines oder Heredocs verwenden, wie Mark und Peter vorgeschlagen haben. Sowohl in meinen Beispielen als auch in ihren Beispielen enthalten die Zeilen "von" und "wo" aufgrund ihrer Einrückung im Code führende Leerzeichen. Wenn dieses Leerzeichen nicht gewünscht wird, müssen Sie wie jetzt verkettete Zeichenfolgen verwenden.
quelle
%q
Familie erzeugte Zeichenfolgen enthalten die Zeilenumbrüche, die nicht dem ursprünglichen Code entsprechen.Manchmal lohnt es sich, neue Zeilenzeichen zu entfernen
\n
wie:quelle
Sie können auch doppelte Anführungszeichen verwenden
Verwenden Sie bei Bedarf zum Entfernen von Zeilenumbrüchen "\ n" den Backslash "\" am Ende jeder Zeile
quelle
"" + "double quotes with some content" + ""
."x"
sieht einfach besser aus und funktioniert schneller als"""x"""
(was im Grunde das gleiche ist wie""+"x"+""
) oder"""""x"""""
(was das gleiche ist wie"" + "" + "x" + "" + ""
). Es ist Ruby, nicht Python, wo Sie verwenden,"""
anstatt"
wenn Sie eine mehrzeilige Zeichenfolge benötigen.quelle
Andere Optionen:
quelle
<<EOM
zu<<-EOM
, nicht wahr?<<-EOF
Beispiel zu funktionieren . Ich vermute, dass so oder so funktioniert.Mit den neuen Funktionen in Ruby 2.3 können
squiggly HEREDOC
Sie kürzlich unsere mehrzeiligen Zeichenfolgen mit einer minimalen Änderung auf eine nette Art und Weise schreiben..squish
Wenn Sie diese in Kombination mit (wenn Sie Schienen verwenden) verwenden, können Sie mehrzeilig auf eine nette Art und Weise schreiben! bei Rubin nur verwenden, können Sie eine tun ,<<~SQL.split.join(" ")
das ist fast die gleicheref: https://infinum.co/the-capsized-eight/multiline-strings-ruby-2-3-0-the-squiggly-heredoc
quelle
<< ist der Verkettungsoperator für Zeichenfolgen
quelle
+
ist der reguläre Verkettungsoperator,<<
ist der In-Place- Append-Operator. Die Verwendung von Nebenwirkungen auf ein Literal funktioniert hier zufällig (die erste Zeichenfolge wird zweimal geändert und zurückgegeben), aber meiner Meinung nach ist es seltsam und bringt mich dazu, eine doppelte Aufnahme zu machen, wo+
dies vollkommen klar wäre. Aber vielleicht bin ich neu bei Ruby ...frozen_string_literal
aktiviert istWenn Sie tun Geist zusätzliche Leerzeichen und Zeilenumbrüche, können Sie
(Verwenden Sie% W für interpolierte Zeichenfolgen)
quelle
Um zu vermeiden, dass die Klammern für jede Zeile geschlossen werden, können Sie einfach doppelte Anführungszeichen mit einem Backslash verwenden, um die neue Zeile zu umgehen:
quelle
Dieser Vorschlag hat gegenüber Dokumenten und langen Zeichenfolgen den Vorteil, dass automatische Einrückungen jeden Teil der Zeichenfolge entsprechend einrücken können. Aber es kommt zu Effizienzkosten.
quelle
Der Ruby-Weg (TM) seit Ruby 2.3: Um eine mehrzeilige Zeichenfolge mit Zeilenumbrüchen und korrekter Identifizierung zu definieren, verwenden Sie das schnörkellose HEREDOC
<<~
:Wenn die richtige Identifizierung kein Problem darstellt, können einfache und doppelte Anführungszeichen in Ruby mehrere Zeilen umfassen:
Wenn einfache oder doppelte Anführungszeichen umständlich sind, da dies viel Escapezeichen erfordern würde, ist die prozentuale Zeichenfolgenliteralnotation
%
die flexibelste Lösung:Wenn das Ziel darin besteht, die Zeilenumbrüche zu vermeiden (die sowohl das schnörkellose HEREDOC als auch die Anführungszeichen und das prozentuale Zeichenfolgenliteral verursachen), setzt ein Backslash als letztes Nicht-Leerzeichen die Zeile fort und veranlasst Ruby, die Zeichenfolgen hintereinander zu verketten (Achten Sie auf die Leerzeichen in der angegebenen Zeichenfolge):
Wenn Sie Rails verwenden,
String.squish
wird die Zeichenfolge aus führendem und nachfolgendem Leerzeichen entfernt und alle aufeinander folgenden Leerzeichen (Zeilenumbrüche, Tabulatoren und alle) in einem einzigen Leerzeichen zusammengefasst:Mehr Details:
Ruby HEREDOC-Syntax
Die Here Document Notation für Strings ist eine Möglichkeit, lange Textblöcke inline im Code zu kennzeichnen. Es wird
<<
gefolgt von einem benutzerdefinierten String (dem Terminator für das Ende des Strings) gestartet . Alle folgenden Zeilen werden verkettet, bis der Terminator End of String ganz am Anfang einer Zeile steht:Der End of String-Terminator kann frei gewählt werden, es ist jedoch üblich, etwas wie "EOS" (End of String) oder etwas zu verwenden, das mit der Domäne des Strings übereinstimmt, wie z. B. "SQL".
HEREDOC unterstützt standardmäßig die Interpolation oder wenn der EOS-Terminator in doppelte Anführungszeichen gesetzt ist:
Die Interpolation kann deaktiviert werden, wenn der EOS-Terminator in einfachen Anführungszeichen steht:
Eine wichtige Einschränkung von
<<HEREDOC
ist, dass der End of String-Terminator am Anfang der Zeile stehen muss:Um dies zu
<<-
umgehen, wurde die Syntax erstellt. Dadurch kann der EOS-Terminator eingerückt werden, damit der Code besser aussieht. Die Zeilen zwischen dem<<-
und dem EOS-Terminator werden weiterhin in vollem Umfang einschließlich aller Einrückungen verwendet:Seit Ruby 2.3 haben wir jetzt das schnörkellose HEREDOC,
<<~
das führende Leerzeichen entfernt:Leere Zeilen und Zeilen, die nur Tabulatoren und Leerzeichen enthalten, werden von << ~ ignoriert
Wenn sowohl Tabulatoren als auch Leerzeichen verwendet werden, werden Tabulatoren als 8 Leerzeichen betrachtet. Wenn sich die Zeile mit dem geringsten Einzug in der Mitte einer Registerkarte befindet, wird diese Registerkarte nicht entfernt.
HEREDOC kann einige verrückte Dinge tun, wie das Ausführen von Befehlen mit Backticks:
HEREDOC-String-Definitionen können "gestapelt" werden, was bedeutet, dass der erste EOS-Terminator (EOSFOO unten) den ersten String beendet und den zweiten startet (EOSBAR unten):
Ich glaube nicht, dass irgendjemand es jemals als solches verwenden würde, aber das
<<EOS
ist wirklich nur ein String-Literal und kann überall dort platziert werden, wo normalerweise ein String platziert werden kann:Wenn Sie nicht über Ruby 2.3, sondern über Rails
>=
3.0 verfügen, können Sie Folgendes verwendenString.strip_heredoc
wie<<~
Prozent String Literals
Siehe RubyDoc , wie Sie die Prozentzeichen verwenden , gefolgt von einer Zeichenkette in einem Klammerpaar wie ein
%(...)
,%[...]
,%{...}
usw. , oder ein Paar von jedem nicht-alphanumerischen Zeichen wie%+...+
Letzte Worte
Zuletzt, um die Antwort auf die ursprüngliche Frage zu erhalten: "Gibt es eine Möglichkeit, eine Verkettung zu implizieren?" geantwortet: Ruby impliziert immer eine Verkettung, wenn zwei Zeichenfolgen (einfache und doppelte Anführungszeichen) hintereinander gefunden werden:
Die Einschränkung ist, dass dies nicht über Zeilenumbrüche hinweg funktioniert, da Ruby ein Ende der Anweisung interpretiert und die konsequente Zeile von nur Zeichenfolgen allein in einer Zeile nichts bewirkt.
quelle
Elegante Antwort heute:
Es gibt einen Unterschied in
<<-TEXT
und<<~TEXT
, erstere behält den Abstand innerhalb des Blocks bei und letztere nicht.Es gibt auch andere Optionen. Wie Verkettung usw., aber diese ist im Allgemeinen sinnvoller.
Wenn ich mich hier irre, lass es mich wissen ...
quelle
Wie Sie habe auch ich nach einer Lösung gesucht, die keine Zeilenumbrüche enthält . (Während sie in SQL sicher sind, sind sie in meinem Fall nicht sicher und ich habe einen großen Textblock zu bearbeiten)
Dies ist wohl genauso hässlich, aber Sie können Zeilenumbrüche in einem Heredoc rückgängig machen, um sie aus der resultierenden Zeichenfolge zu entfernen:
Beachten Sie, dass dies ohne Interpolation (IE
<<~'END_OF_INPUT'
) nicht möglich ist. Seien Sie also vorsichtig.#{expressions}
werden hier ausgewertet, während sie nicht in Ihrem Originalcode enthalten sind. A. Wilsons Antwort könnte aus diesem Grund besser sein.quelle