Was ist der Anwendungsfall für Rubys% q /% Q-Zitiermethoden?

72

Ich habe Thomas 'Programming Ruby 1.9 gelesen und bin auf die alternativen abgegrenzten Methoden für einfache und doppelte Anführungszeichen gestoßen ( %q / %Q). Ich kenne sie auch aus anderen Ruby-Sprachreferenzen.

%q/I'm acting like a single-quoted string/

%Q|"I'm acting like a double-quoted string" --Anonymous|

Ich habe nicht lange mit Ruby gearbeitet, aber ich habe diese Anführungsmethode im Produktionscode noch nie erlebt.

Abgesehen von der offensichtlichen Möglichkeit, das interne Entkommen von Anführungszeichen mit Backslashes zu vermeiden , was sind die häufigsten Anwendungsfälle für diese Methode zum Zitieren über reguläre einfache oder doppelte Anführungszeichen? Werden sie normalerweise in ein- oder mehrzeiligen Zeichenfolgen verwendet? Werden sie bei Verwendung in mehrzeiligen Zeichenfolgen jemals gegenüber HEREDOC-Zeichenfolgen bevorzugt? Gibt es eine bestimmte Ruby-Sprache, in der sie häufig vorkommen?

Michael Berkowski
quelle
4
Ich dachte, das wäre der Anwendungsfall. Ich benutze Heredocs nur für mehrzeilige Strings.
Dave Newton
1
Heredocs haben den großen Vorteil, dass Sie das Intro in eine Codekette einfügen können, damit die Codezeile, in der es verwendet wird, nicht unterbrochen wird, wie instr = <<-TEXT.lines.map(&:strip) ...
Niklas B.
1
// Ich habe nicht lange mit Ruby gearbeitet, aber ich habe diese Anführungsmethode im Produktionscode noch nie erlebt.// Diese Ruby-Sprachfunktion führt ihre Vorfahren auf Perl zurück. Daher ist es wahrscheinlicher, dass dies bei Rubyisten verwendet wird, die auch aktuelle oder ehemalige Perl-Entwickler sind. Um mehrere Beispiele zu finden, suchen Sie nach "Perl quotelike operator".
Dreftymac

Antworten:

111

Sie sind außerordentlich nützlich, um HTML mit JavaScript zu umgehen, wenn Ihnen bereits die Zitiermethoden "ausgehen":

link = %q[<a href="javascript:method('call')">link</a>]

Ich habe auch festgestellt, dass sie bei der Arbeit mit mehrzeiligen SQL-Anweisungen sehr nützlich sind:

execute(%Q[
  INSERT INTO table_a (column_a)
    SELECT value
      FROM table_b
      WHERE key='value'
])

Der Vorteil besteht darin, dass Sie nicht auf die Art der in Ihrer Abfrage verwendeten Angebote achten müssen. Es funktioniert entweder mit Single, Double oder beiden. Sie sind auch viel weniger Aufhebens als die HEREDOC-Methode.

Ruby bietet andere praktische Methoden wie diese, mit %rdenen reguläre Ausdrücke erstellt werden können. Das vermeidet Schrägstriche, wenn versucht wird, einen zu schreiben, der solche Dinge handhabt http://, sonst müsste entkommen.

Tadman
quelle
Das JavaScript-Beispiel, das ich nicht berücksichtigt hatte - bei dem die Funktion des internen Anführungszeichens syntaktisch von Bedeutung ist und es verwirrend wird, welcher Kontext (das Markup-Attribut, die JS-Zeichenfolge oder die gesamte äußere Zeichenfolge) derzeit in Anführungszeichen gesetzt und maskiert wird.
Michael Berkowski
Der HEREDOC-Stil ist in Ordnung, wenn eine Variable deklariert wird, aber äußerst hässlich, wenn er als Argument für eine Methode verwendet wird, insbesondere wenn Sie versuchen, zwei davon als unterschiedliche Argumente anzugeben. Sie sind für die Uneingeweihten ziemlich verwirrend.
Tadman
10

Überblick

Neben "Vermeiden Sie internes Entkommen von Anführungszeichen" und den zuvor von @tadman bereitgestellten Beispielen gibt es auch andere Anwendungsfälle:

  • automatisch generierenden Code in derselben Sprache wie der Generator selbst (z. B. Ruby, der Ruby generiert)
  • Bereitstellung von sauber formatiertem Code, der die Syntaxhervorhebungsfunktion Ihres Texteditors nicht verwirrt
  • Ermöglichen das Speichern von Codeblöcken, die möglicherweise mehrere Speicherebenen durchlaufen müssen (z. B. eine Datenbank, die mit einer Website interagiert, oder ein Snippets-Verwaltungssystem, das mit einem Texteditor interagiert, der mit einer Subshell interagiert usw.).

Einzelheiten

Dieser Ansatz ist eine universelle und robuste Redewendung, die sich gut für alle Tools eignet, die automatisierte Codegenerierung durchführen, einschließlich, aber nicht beschränkt auf Tools, die Code in anderen Sprachen schreiben, oder Tools, die Codefragmente für eine IDE oder einen Texteditor verwalten .

Neben den bereits von @tadman bereitgestellten Beispielen gibt es den allgemeinen Fall des Generierens von Code, bei dem der generierte Code dieselbe oder im Wesentlichen ähnliche Syntax wie der Code des generierenden Programms aufweist.

In diesen Fällen hilft die Lösung nicht nur dabei, die Verwendung von Backslashes zu vermeiden, um Anführungszeichen zu vermeiden. Ohne eine solche Lösung kann es Fälle geben, in denen die Wartung des generierten Codes äußerst schwierig wird.

Um Beispiele dafür zu sehen, schauen Sie sich bitte die folgenden Referenzen an.

Verweise

[Siehe z.

]]

dreftymac
quelle
3

Es ist vielleicht erwähnenswert, dass% q standardmäßig von Bundler und Juwelier beim Generieren von Gemspecs für den Abschnitt Zusammenfassung / Beschreibung der Gemspec verwendet wird. Dies verhindert, dass jemand Anführungszeichen in der Zusammenfassung oder Beschreibung verwendet und die Gemspec bricht.

Dan Garland
quelle
3

Ich weiß, dass dies ein alter Thread ist, aber ich habe sie in der Produktion verwendet, als ich einen Systembefehl aufrief und einige Werte interpolieren wollte, wie zum Beispiel:

 system(%Q(ffmpeg -y -i "#{input_filepath}" -qscale:a 2 "#{output_filepath}"))

Super praktisch.

Ryan Rebo
quelle
-1

Sie sind nützlich, wenn Ihre Zeichenfolge einfache oder doppelte Anführungszeichen enthält. Dies kommt nicht allzu oft vor, aber die Technik ist sehr nützlich, wenn dies der Fall ist.

Peter
quelle
1
Der Op sagte, er wolle etwas anderes wissen als "Vermeiden Sie es, sich intern den Zitaten zu entziehen".
Xdazz