Ich habe ein Problem mit einem Ruby-Heredoc, den ich machen möchte. Es gibt das führende Leerzeichen aus jeder Zeile zurück, obwohl ich den Operator - einschließe, der alle führenden Leerzeichen unterdrücken soll. Meine Methode sieht so aus:
def distinct_count
<<-EOF
\tSELECT
\t CAST('#{name}' AS VARCHAR(30)) as COLUMN_NAME
\t,COUNT(DISTINCT #{name}) AS DISTINCT_COUNT
\tFROM #{table.call}
EOF
end
und meine Ausgabe sieht so aus:
=> " \tSELECT\n \t CAST('SRC_ACCT_NUM' AS VARCHAR(30)) as
COLUMN_NAME\n \t,COUNT(DISTINCT SRC_ACCT_NUM) AS DISTINCT_COUNT\n
\tFROM UD461.MGMT_REPORT_HNB\n"
Dies ist natürlich in diesem speziellen Fall richtig, mit Ausnahme aller Leerzeichen zwischen dem ersten "und \ t. Weiß jemand, was ich hier falsch mache?
quelle
Wenn Sie Rails 3.0 oder höher verwenden, versuchen Sie es
#strip_heredoc
. In diesem Beispiel aus den Dokumenten werden die ersten drei Zeilen ohne Einrückung gedruckt, wobei die Zwei-Leerzeichen-Einrückung der letzten beiden Zeilen beibehalten wird:In der Dokumentation heißt es außerdem: "Technisch wird nach der am wenigsten eingerückten Zeile in der gesamten Zeichenfolge gesucht und diese Menge an führenden Leerzeichen entfernt."
Hier ist die Implementierung von active_support / core_ext / string / strip.rb :
Die Tests finden Sie in test / core_ext / string_ext_test.rb .
quelle
require "active_support/core_ext/string"
zuersttry
ist nicht für String definiert. In der Tat scheint es, dass es ein Schienen-spezifisches Konstrukt istIch fürchte, ich habe nicht viel zu tun. Normalerweise mache ich:
Das funktioniert aber ist ein bisschen ein Hack.
EDIT: Ich lasse mich von Rene Saarsoo inspirieren und schlage stattdessen Folgendes vor:
Diese Version sollte funktionieren, wenn die erste Zeile nicht die am weitesten links liegende ist.
quelle
EOF
selbst und nicht nurString
?\s
Probieren Sie eine dieser Zeilen mit Leerzeilen im Inhalt aus und denken Sie daran, dass dies auch Zeilenumbrüche enthält.Hier ist eine weitaus einfachere Version des nicht eingerückten Skripts, das ich verwende:
Verwenden Sie es so:
Wenn die erste Zeile möglicherweise stärker als andere eingerückt ist und (wie Rails) basierend auf der am wenigsten eingerückten Zeile nicht eingerückt werden soll, möchten Sie möglicherweise stattdessen Folgendes verwenden:
Beachten Sie, dass beim Scannen nach
\s+
statt[ \t]+
möglicherweise Zeilenumbrüche aus Ihrem Heredoc entfernt werden, anstatt Leerzeichen zu führen. Nicht wünschenswert!quelle
<<-
In Ruby wird nur das führende Leerzeichen für das Endtrennzeichen ignoriert, sodass es ordnungsgemäß eingerückt werden kann. Das führende Leerzeichen in Zeilen innerhalb der Zeichenfolge wird nicht entfernt, obwohl dies in einigen Online-Dokumentationen möglicherweise steht.Sie können führende Leerzeichen selbst entfernen, indem Sie Folgendes verwenden
gsub
:Oder wenn Sie nur Leerzeichen entfernen möchten, lassen Sie die Registerkarten:
quelle
Einige andere Antworten finden die Einrückungsebene der geringsten eingekerbten Linie , und löschen Sie, dass aus allen Linien, aber die Art der Vertiefung unter Berücksichtigung bei der Programmierung (dass die erste Zeile ist die am wenigsten eingerückt), ich glaube , Sie für die Vertiefung Niveau aussehen sollte die erste Zeile .
quelle
Wie das Originalplakat entdeckte auch ich die
<<-HEREDOC
Syntax und war verdammt enttäuscht, dass sie sich nicht so verhielt, wie ich es mir vorgestellt hatte.Aber anstatt meinen Code mit gsub-s zu verunreinigen, habe ich die String-Klasse erweitert:
quelle
Hinweis: Wie @radiospiel hervorhob,
String#squish
ist es nur imActiveSupport
Kontext verfügbar .Ich glaube
Ruby istString#squish
ist näher an dem, wonach Sie wirklich suchen:So würde ich mit Ihrem Beispiel umgehen:
quelle
Eine andere leicht zu merkende Option ist die Verwendung eines nicht eingerückten Edelsteins
quelle
Ich musste etwas verwenden, mit
system
dem ich langesed
Befehle über Zeilen aufteilen und dann Einrückungen UND Zeilenumbrüche entfernen konnte ...Also habe ich mir Folgendes ausgedacht:
Standardmäßig werden keine Zeilenumbrüche entfernt, wie bei allen anderen Beispielen.
quelle
Ich sammle Antworten und habe Folgendes erhalten:
Es generiert exzellentes SQL und verlässt nicht die AR-Bereiche.
quelle