Doppelte oder einfache Anführungszeichen

171

Ich bin wirklich neu in Ruby und ich versuche zu verstehen, ob es einen bestimmten Zeitpunkt gibt, zu dem ich ""vs verwenden sollte ''.

Ich habe die meiste Zeit einfache Anführungszeichen verwendet, weil es einfacher zu tippen ist, aber ich bin mir nicht sicher, ob ich sollte.

zB get 'user/new'vs.get "user/new"

imjp
quelle
12
Sind Sie sicher, dass dies eine RoR-Frage ist und nicht nur eine Ruby-Frage?
Ignacio Vazquez-Abrams
Gibt es einen relevanten Styleguide für die Auswahl, wann keine String-Interpolation erforderlich ist?
William Entriken

Antworten:

202

" " Ermöglicht die Interpolation von Zeichenfolgen, z.

world_type = 'Mars'
"Hello #{world_type}"
Jits
quelle
1
Verwenden Sie also im Grunde immer doppelte Anführungszeichen, oder?
Nekonari
8
Nein - doppelte Anführungszeichen ermöglichen einfach die Zeichenfolgeninterpolation. Wenn Sie keine Zeichenfolgeninterpolation wünschen, sollten Sie keine doppelten Anführungszeichen verwenden.
Panh
4
Es gibt keinen Grund, doppelte Anführungszeichen nur dann zu verwenden, wenn Sie eine Interpolation benötigen. Es gibt keine signifikanten Auswirkungen auf die Leistung und Sie werden nur darüber nachdenken, was Sie verwenden müssen. Verwenden Sie einfach Zeichenfolgen in doppelten Anführungszeichen.
Matheus
137

Mit Ausnahme der Interpolation besteht ein weiterer Unterschied darin, dass die Escape-Sequenz nicht in einfachen Anführungszeichen funktioniert

puts 'a\nb' # just print a\nb 
puts "a\nb" # print a, then b at newline 
lfx_cool
quelle
42
Mit Ausnahme der Flucht vor einfachen Anführungszeichen selbst, z 'don\'t'.
Sparhawk
3
Dies ist eine sehr nützliche Antwort auf diese Frage. Ich habe nie bemerkt, dass bei einfachen Anführungszeichen buchstäblich alles zwischen den einfachen Anführungszeichen gedruckt wird, mit Ausnahme von Anführungszeichen, die maskiert werden müssen. Danke dir.
Jay Godse
6
Und Backslash auch versuchen puts '\\'Es wird nur ein einziger Schrägstrich gedruckt. siehe hier stackoverflow.com/questions/25499046/…
Hardik
Ja, sind die einzigen zwei Fälle, denen Sie mit einfachen Anführungszeichen entkommen können
Alexis
@Alexis nicht sicher, vielleicht ein kleiner Unterschied in der Leistung
lfx_cool
40

Um Ihre Frage zu beantworten, müssen Sie Folgendes verwenden, ""wenn Sie eine Zeichenfolgeninterpolation durchführen möchten:

a = 2
puts "#{a}"

Verwenden Sie ansonsten einfache Anführungszeichen.

Auch wenn Sie sich fragen, ob es einen Unterschied in der Leistung gibt, gibt es bei StackOverflow eine ausgezeichnete Frage dazu.

Und wenn Sie RoR noch nicht kennen, fordere ich Sie dringend auf, ein anständiges Ruby-Buch in die Hand zu nehmen, um die Grundlagen der Sprache zu erlernen. Es wird Ihnen helfen zu verstehen, was Sie tun (und Sie davon abhalten zu denken, dass Rails magisch ist). Ich persönlich empfehle The Well Grounded Rubyist .

Amokrane Chentir
quelle
34

In Ruby gibt es einen Unterschied zwischen einfachen ''und doppelten Anführungszeichen ""in Bezug darauf, was als Zeichenfolge ausgewertet werden soll.

Zunächst möchte ich klarstellen, dass in der Literalform eines Strings alles, was zwischen einfachen oder doppelten Anführungszeichen steht, als String-Objekt ausgewertet wird, das eine Instanz der Ruby String-Klasse ist.

Daher 'stackoverflow'und "stackoverflow"beide bewerten Instanzen der String-Klasse ohne Unterschied .

Der Unterschied

Der wesentliche Unterschied zwischen den beiden wörtlichen Formen von Zeichenfolgen (einfache oder doppelte Anführungszeichen) besteht darin, dass doppelte Anführungszeichen Escape-Sequenzen zulassen, einfache Anführungszeichen jedoch nicht!

Ein durch einfache Anführungszeichen erstelltes Zeichenfolgenliteral unterstützt keine Zeichenfolgeninterpollation und entgeht keinen Sequenzen.

Ein gutes Beispiel ist:

"\n" # will be interpreted as a new line

wohingegen

'\n' # will display the actual escape sequence to the user

Das Interpolieren mit einfachen Anführungszeichen funktioniert überhaupt nicht:

'#{Time.now}'
=> "\#{Time.now}" # which is not what you want..

Beste Übung

Wie die meisten Ruby Linters empfehlen, verwenden Sie für Ihre Zeichenfolgen einfache Anführungszeichen und bei Interpolations- / Escape-Sequenzen die doppelten.

Aloucas
quelle
1
Wenn Sie also a = '\ n' und b = "# {a}" hätten, würde b als neue Zeile oder als Escape-Sequenz interpretiert?
NathanTempelman
4
In dem Moment, in dem Sie a = '\ n' a zuweisen, wird durch Interpollieren von a nach b als "\\ n" interpretiert, und Sie erhalten keine neue Zeile. b wird auf "\\ n" ausgewertet (keine neue Zeile erhält die Escape-Sequenz). a = '\ n' => "\\ n" wobei als = "\ n" => "\ n"
aloucas
6

Zeichenfolgen mit einfachen Anführungszeichen verarbeiten keine ASCII-Escape-Codes (\ n, \ t usw.) und führen keine Zeichenfolgeninterpolation durch, während doppelte Anführungszeichen beides ausführen.

Beispiel für einen Escape-Code:

2.4.0 :004 >   puts 'Hello \n World'
Hello \n World

2.4.0 :005 > puts "Hello \n World"
Hello
World

Interpolationsbeispiel:

2.4.0 :008 >   age=27
 => 27

2.4.0 :009 > puts 'Age: #{age}'
Age: #{age}

2.4.0 :009 > puts "Age: #{age}"
Age: 27
Imran Ahmad
quelle
4

Ähnlich wie bei der Antwort "\ n" beim Drucken ist das Folgende ein weiterer Fall des Unterschieds

puts "\1"  -> get special character
puts '\1'  -> get \1

Es sieht also so aus, als ob * in doppelte Anführungszeichen umgewandelt wurde, jedoch nicht in einfache Anführungszeichen. Übrigens wirkt sich dies auf die Ausgabe aus, wenn ein regulärer Ausdruck verwendet wird, z. B. str.gsub (/ regulärer Ausdruck /, '\ 1, \ 2').

Bryan Liu
quelle
2

Ein weiterer Grund, warum Sie einfache Anführungszeichen verwenden möchten, ist die Übergabe eines Regex-Musters als Zeichenfolge:

Dieses Regex-Muster funktioniert, da es in einfachen Anführungszeichen übergeben wird:

"123 ABC".match('\d')
=> #<MatchData "1">

Dieses Regex-Muster schlägt fehl, weil es in doppelten Anführungszeichen übergeben wird (Sie müssten es doppelt maskieren, damit es funktioniert):

"123 ABC".match("\d")
=> nil
Yarin
quelle
-8

In diesem speziellen Fall spielt es keine Rolle, wie Sie es schreiben. Sie sind gleichwertig. Vielleicht möchten Sie auch einige weitere Ruby-Anleitungen / Tutorials lesen :)

Geo
quelle
4
Sie sind nicht äquivalent, da doppelte Anführungszeichen die Interpretation von Zeichenfolgen ermöglichen.
Jason Noble
7
Haben Sie den Teil "In diesem speziellen Fall" gelesen, bevor Sie diese äußerst kluge Beobachtung gemacht haben?
Geo
9
Ja, aber seine Frage war, wann man einfache oder doppelte Anführungszeichen verwendet.
Jason Noble