Podwójne a pojedyncze cudzysłowy


171

Jestem naprawdę nowego do Ruby i staram się zrozumieć, jeśli istnieje specyficzny czas, kiedy należy używać ""vs ''.

Przez większość czasu używam pojedynczych cudzysłowów, ponieważ łatwiej jest pisać, ale nie jestem pewien, czy powinienem.

np. get 'user/new'vsget "user/new"


12
Czy na pewno jest to pytanie dotyczące RoR, a nie tylko pytania dotyczące Rubiego?
Ignacio Vazquez-Abrams

Czy istnieje odpowiedni przewodnik po stylu dotyczący wyboru, kiedy interpolacja ciągów nie jest potrzebna?
William Entriken

Odpowiedzi:


202

" " pozwala na interpolację ciągów, np .:

world_type = 'Mars'
"Hello #{world_type}"

1
Więc po prostu używaj przez cały czas podwójnych cudzysłowów, prawda?
nekonari,

8
Nie - podwójne cudzysłowy pozwalają po prostu na interpolację ciągów znaków. Jeśli nie chcesz interpolacji ciągów, nie powinieneś używać podwójnych cudzysłowów.
Panh,

4
Nie ma powodu, aby używać podwójnych cudzysłowów tylko wtedy, gdy potrzebujesz interpolacji, nie ma to znaczącego wpływu na wydajność i po prostu sprawi, że pomyślisz, czego musisz użyć. Po prostu użyj ciągów w podwójnych cudzysłowach.
Matheus

137

poza interpolacją inną różnicą jest to, że „sekwencja ucieczki” nie działa w pojedynczym cudzysłowie

puts 'a\nb' # just print a\nb 
puts "a\nb" # print a, then b at newline 

42
Oprócz unikania samych cudzysłowów, np 'don\'t'.
Sparhawk

3
To bardzo przydatna odpowiedź na tę kwestię. Nigdy nie zdawałem sobie sprawy, że pojedyncze cudzysłowy mają na celu wypisanie dosłownie wszystkiego pomiędzy pojedynczymi cudzysłowami, z wyjątkiem cudzysłowów, które muszą zostać pominięte. Dziękuję Ci.
Jay Godse,

6
I backslash też spróbuj puts '\\'Wypisze tylko pojedynczy ukośnik. patrz tutaj stackoverflow.com/questions/25499046/…
Hardik

tak, to jedyne dwa przypadki, przed którymi można uciec, stosując pojedyncze cudzysłowy
Alexis,

@Alexis nie jest pewien, może mała różnica w wydajności
lfx_cool

40

Aby odpowiedzieć na twoje pytanie, musisz użyć, ""gdy chcesz wykonać interpolację ciągów:

a = 2
puts "#{a}"

W przeciwnym razie użyj prostych cudzysłowów.

Również jeśli zastanawiasz się, czy istnieje różnica w wydajności, jest doskonały w StackOverflow pytanie na ten temat.

A jeśli jesteś naprawdę nowy w RoR, zachęcam do sięgnięcia po porządną książkę Ruby, aby nauczyć się podstaw języka. Pomoże ci to zrozumieć, co robisz (i powstrzyma cię od myślenia, że ​​Railsy to magia). Osobiście polecam The Well grounded Rubyist .


34

Istnieje różnica między pojedynczymi ''i podwójnymi cudzysłowami"" w Rubim pod względem tego, co ma zostać ocenione jako łańcuch.

Na początku chciałbym wyjaśnić, że w dosłownej formie łańcucha cokolwiek znajduje się między pojedynczym a podwójnym cudzysłowami, jest oceniane jako obiekt typu string, który jest instancją klasy Ruby String.

W związku z tym, 'stackoverflow'i "stackoverflow"zarówno oceni instancje klasy String z żadnej różnicy .

Różnica

Zasadnicza różnica między dwoma literalnymi formami łańcuchów (apostrofami lub cudzysłowami) polega na tym, że cudzysłowy podwójne pozwalają na sekwencje specjalne, podczas gdy apostrofy nie!

Literał tekstowy utworzony za pomocą apostrofów nie obsługuje interpolacji ciągów i nie powoduje zmiany znaczenia sekwencji.

Zgrabnym przykładem jest:

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

natomiast

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

Interpolacja z pojedynczymi cudzysłowami w ogóle nie działa:

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

Najlepsze praktyki

Jak sugeruje większość Ruby Linters, używaj pojedynczych cudzysłowów dla swoich ciągów znaków i idź na podwójne w przypadku sekwencji interpolacji / ucieczki.


1
Więc gdybyś miał a = '\ n' i b = "# {a}", czy b zostałoby zinterpretowane jako nowa linia, czy jako sekwencja ucieczki?
NathanTempelman

4
W momencie przypisania a = '\ n' a zostanie zinterpretowane jako „\\ n” przez interpolację a do b, nie otrzymasz nowej linii. b zmieni się na "\\ n" (bez nowej linii otrzymasz sekwencję ucieczki). a = '\ n' => "\\ n" gdzie jako a = "\ n" => "\ n"
aloucas

6

Łańcuchy w apostrofach nie przetwarzają kodów zmiany znaczenia ASCII (\ n, \ t itp.) I nie wykonują interpolacji ciągów, podczas gdy cudzysłowy robią jedno i drugie.

Przykład kodu ucieczki:

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

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

Przykład interpolacji:

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

4

Podobnie jak w przypadku odpowiedzi „\ n” w druku, poniżej znajduje się kolejny przypadek różnicy

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

więc wygląda na to, że * został zamieniony na znak ze znakiem ucieczki w cudzysłowach, ale nie w apostrofach. BTW, wpłynie to na wynik w przypadku użycia w wyrażeniu regularnym, np. Str.gsub (/ wyrażenie regularne /, '\ 1, \ 2')


2

Innym powodem, dla którego warto używać pojedynczych cudzysłowów, jest przekazywanie wzorca wyrażenia regularnego jako łańcucha:

Ten wzorzec wyrażenia regularnego będzie działać, ponieważ jest przekazywany w apostrofach:

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

Ten wzorzec wyrażenia regularnego nie powiedzie się, ponieważ jest przekazywany w cudzysłowach (aby to zadziałało, trzeba by od niego uciec podwójnie):

"123 ABC".match("\d")
=> nil

-8

W tym konkretnym przypadku nie ma znaczenia, jak to napiszesz. Są równoważne. Możesz także przeczytać więcej przewodników / tutoriali dotyczących Rubiego :)


4
Nie są równoważne, ponieważ podwójne cudzysłowy pozwalają na interpretację ciągów.
Jason Noble

7
Czy przeczytałeś część „W tym konkretnym przypadku”, zanim dokonałeś tej niezwykle sprytnej obserwacji?
Geo

9
Tak, ale jego pytanie brzmiało, kiedy używać cudzysłowów pojedynczych, a kiedy podwójnych.
Jason Noble
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.