2009-03-15 12 views
24

Wenn ich einen umgekehrten Schrägstrich + Raum zu Beginn der Doppel- und Einzel Anführungszeichen hinzufügen, erhalte ich unterschiedliche Ergebnisse:Umgekehrte Schrägstriche in einzelnen Strings in Anführungszeichen vs. Doppel Anführungszeichen

"\ text" 
'\ text' 

In der Ausgabe für die doppelten Anführungszeichen Ich sehe nur ein Leerzeichen.
In der Ausgabe für die einzelne Zeichenfolge in Anführungszeichen finde ich Backslash + Leerzeichen.

Was passiert dort? Ist das so, weil '\ ' als ein Sonderzeichen in der doppelten Anführungszeichenfolge interpretiert wird, aber in der einzelnen Zeichenfolge in Anführungszeichen die Zeichen beibehalten werden?

Wenn ich die Saiten dies zu ändern, sehe ich die gleiche Leistung, nämlich einen einzelnen gefolgt von einem Leerzeichen Strich und dann den Text:

"\\ text" 
'\\ text' 

In beiden Fällen wird der Backslash geschützt ist. Ich bin verwirrt, warum sie in dieser Situation genauso arbeiten.

Gibt es eine Regel, die helfen würde, den fundamentalen Unterschied zwischen der Behandlung von umgekehrten Schrägstrichen in Ruby durch Strings in einfachen Anführungszeichen und in Anführungszeichen mit doppelten Anführungszeichen zu erklären?

+0

Nach Ihren Änderungen ist Ihre Frage jetzt im Wesentlichen "ist Wikibooks aktuell für Ruby 1.9". Bitte bearbeiten Sie den Fragetitel entsprechend. – bzlm

Antwort

6

Ich verweise Sie auf "Ruby Programming/Strings" für einen sehr kompakten und dennoch umfassenden Überblick über die Unterschiede.

Aus dem Referenz:

puts "Betty's pie shop"

puts 'Betty\'s pie shop'

Denn "Betty" enthält einen Apostroph, die den gleichen Charakter wie das Apostroph ist, in der zweiten Zeile müssen wir verwenden ein umgekehrter Schrägstrich, um das Apostroph zu umgehen, so dass Ruby versteht, dass das Apostroph im Zeichenfolgenliteral ist, anstatt das Ende des Zeichenfolgenliterals zu markieren. Der Backslash gefolgt von dem einfachen Anführungszeichen wird als Escape-Sequenz bezeichnet.

+6

Von ["Wie schreibe ich eine gute Antwort?"] (Https://stackoverflow.com/help/how-to-answer): "Links zu externen Ressourcen werden empfohlen, aber fügen Sie bitte einen Kontext um den Link hinzu, damit Ihr Kollege Die Benutzer werden eine Vorstellung davon haben, was es ist und warum es da ist. Zitiere immer den relevantesten Teil eines wichtigen Links, falls die Zielseite nicht erreichbar ist oder dauerhaft offline ist. " –

3

Ist dies, weil die ‚\‘ als Sonderzeichen in den doppelten Anführungszeichen Zeichenfolge aber in dem einzigen String in Anführungszeichen interpretieren die Zeichen erhalten sind wie?

Ja. Strings in einfachen Anführungszeichen werden als Literale behandelt. doppelt zitierte Strings werden interpoliert. Dies ist auch in anderen Ruby-ähnlichen Sprachen der Fall und hat sich in 1.9 nicht geändert.

+0

gibt es eine Möglichkeit, doppelte Anführungszeichenfolgen (interpoliert) in ein einfaches Anführungszeichen umzuwandeln? –

+0

Ich wäre überrascht, wenn es nicht gäbe! – bzlm

18

Strings in doppelten Anführungszeichen unterstützen das gesamte Spektrum der Escape-Sequenzen, wie unten dargestellt:

  • \a Glocke/alert (0x07)
  • \b Rück (0x08)
  • \e Escape (0x1b)
  • \f Formford (0x0C)
  • \n Newline (0x0A)
  • \r Return (0x0d)
  • \s Raum (0x20)
  • \t Tab (0x09)
  • \v Vertikale Reiter (0x0b)

Für Single-Strings in Anführungszeichen, zwei aufeinander folgende Schrägstriche ersetzt durch ein einzelner umgekehrter Schrägstrich und ein umgekehrter Schrägstrich gefolgt von einem einfachen Anführungszeichen wird zu einem einfachen Anführungszeichen:

+0

Gibt es irgendeine Verwendung für einen einzelnen Backslash in doppelten oder einfachen Strings? Ich bin nur verwirrt, denn es scheint überhaupt nichts zu tun außer verschwinden – thesowismine

4

Dies ist keine vollständige Antwort (da die einfache Frage bereits beantwortet wurde), sondern es sind ergänzende Informationen.

Which style of Ruby string quoting do you favour?

nicht doppelte Anführungszeichen verwenden Sie, wenn Sie sie zu entkommen. Und fallen Sie nicht in "Single vs doppelte Anführungszeichen" Falle. Ruby hat eine hervorragende Unterstützung für beliebige Trennzeichen für Stringliterale:

http://rors.org/2008/10/26/dont-escape-in-strings

ich diesen Rat nahm und haben es nicht bereut!

7

Ruby interpretiert nur Escape-Sequenzen in doppelt zitierten Strings. In einer Zeichenfolge in Anführungszeichen werden nur \\ (umgekehrter Schrägstrich) und \' (umgekehrter Schrägstrich) als Sonderzeichen verwendet. Sie sollten doppelt zitierte Strings nur verwenden, wenn Sie mehr Interpretation benötigen. Andernfalls bieten einfache Anführungszeichen eine Leistungssteigerung.

Wenn Sie erwähnt haben, dass der Name einer Variablen enthalten ist, macht Ruby das nie. Nur der Variablenname wird als mehr vom String-Literal behandelt. Um den Wert einer Variablen enthalten (oder einen beliebigen Ausdruck) setzen den Ausdruck in etwa so aus:

"#{variable}" 

Beachten Sie, dass dies nur funktioniert, in doppelte Anführungszeichen. Um eine Variable zu einem einzigen hinzufügen einer zitiert, müssen Sie dies tun:

'The value of X is: '+X 

Wenn Sie ernsthaft Formatierung benötigen, schauen Sie in Ruby-Version von sprintf und printf. Sie sind ziemlich viele Wrapper rund um die C-Funktionen, und sind ziemlich mächtig, aber ein bisschen umständlich zu verwenden.

+0

Glauben Sie nicht den Teil über die Leistungssteigerung. Es wird nicht in Benchmarks angezeigt, da Ruby die Zeichenfolge beim Laden der Datei analysiert und der Unterschied verschwindet. Wir haben irgendwo in einer der Fragen eine Benchmark zu SO gemacht, mit Ergebnissen, die diese Idee widerlegten. * Wenn * es einen Boost gibt, ist es winzig und wird nur beim Start einer App auftreten. –

+0

@theTinMan: Denkst du, du kannst mich zum Maßstab machen? Ich würde es gerne sehen. Theoretisch sollte es einen Leistungsschub geben, wenn man nicht nach den Escape-Sequenzen suchen muss, aber das ist nur ein kleines bisschen optimiertes C, was ein schwerer Unterschied wäre, es zu bemerken. – Linuxios

+0

Der fragliche [Benchmark] (http://stackoverflow.com/a/13039446/128421) war über verschiedene Möglichkeiten, Arrays zu definieren. Ich denke, dass die gleiche Situation für Strings existiert, dass die Unterschiede entfernt werden, wenn das Skript geladen wird, und einmal im Speicher gibt es keinen wirklichen Unterschied. Es ist einfach, einen Test zu schreiben, um selbst zu sehen, basierend auf dem Benchmark in dieser Antwort. –

Verwandte Themen