큰 따옴표와 작은 따옴표


171

나는 Ruby를 처음 접했고 ""vs 를 사용해야 할 특정 시간이 있는지 이해하려고합니다 ''.

입력하기가 쉽기 때문에 대부분 작은 따옴표를 사용하고 있지만 확실하지는 않습니다.

예 : get 'user/new'vsget "user/new"


12
이것이 Ruby 질문이 아니라 RoR 질문인지 확실합니까?
Ignacio Vazquez-Abrams

문자열 보간이 필요하지 않을 때 선택하는 데 관련된 스타일 가이드가 있습니까?
William Entriken

답변:


202

" " 문자열 보간을 할 수 있습니다. 예 :

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

1
기본적으로 항상 큰 따옴표를 사용하십시오.
nekonari

8
아니요-큰 따옴표는 단순히 문자열 보간을 허용합니다. 문자열 보간을 원하지 않으면 큰 따옴표를 사용하지 않아야합니다.
Panh

4
보간이 필요할 때만 큰 따옴표를 사용해야 할 이유가 없으며 성능에 큰 영향을 미치지 않으며 사용해야 할 것을 생각하게 할 것입니다. 큰 따옴표로 묶은 문자열을 사용하십시오.
Matheus

137

보간을 제외하고 또 다른 차이점은 '탈출 시퀀스'가 작은 따옴표로 작동하지 않는다는 것입니다

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

42
작은 따옴표 자체를 이스케이프하는 것을 제외하고 예를 들어 'don\'t'.
Sparhawk

3
이것은이 질문에 대한 매우 유용한 답변입니다. 나는 작은 따옴표가 이스케이프되어야하는 따옴표를 제외하고 문자 그대로 작은 따옴표 사이의 모든 것을 인쇄하기위한 것임을 결코 깨닫지 못했습니다. 감사합니다.
Jay Godse

6
백 슬래시도 시도하십시오 puts '\\'. 단일 슬래시 만 인쇄합니다. 여기를 참조하십시오 stackoverflow.com/questions/25499046/…
Hardik

yup, 당신은 작은 따옴표로 탈출 할 수있는 유일한 두 경우입니다
Alexis

@Alexis는 확실하지 않습니다. 어쩌면 성능에 약간의 차이가있을 수 있습니다
lfx_cool

40

질문에 대답하려면 ""문자열 보간을 수행 할 때 사용해야 합니다.

a = 2
puts "#{a}"

그렇지 않으면 간단한 따옴표를 사용하십시오.

또한 성능 측면에서 차이가 있는지 궁금하다면 StackOverflow에 대한 훌륭한 질문이 있습니다.

그리고 당신이 RoR을 처음 접한다면, 언어의 기본을 배우기 위해 알맞은 루비 책을 집어들 것을 권합니다. 그것은 당신이하고있는 일을 이해하는 데 도움이 될 것입니다 (그리고 Rails가 마술이라고 생각하지 못하게합니다). 저는 개인적으로 The Welled grounded Rubyist를 추천 합니다.


34

루비에서는 ''작은 따옴표와 큰 따옴표 사이 ""에 문자열로 평가할 내용이 다릅니다 .

처음에, 나는에 그것을 명확히하고자하는 문자열의 문자 형태 사이에 어떤 단일 또는 이중 루비 String 클래스의 인스턴스 인 문자열 객체로 평가 따옴표 가져옵니다.

따라서, 'stackoverflow'그리고 "stackoverflow"모두 String 클래스의 인스턴스를 평가합니다 전혀 차이 .

차이점

두 문자 그대로의 문자열 형식 (단일 또는 큰 따옴표)의 근본적인 차이점은 큰 따옴표는 이스케이프 시퀀스를 허용하지만 작은 따옴표는 그렇지 않습니다!

리터럴 작은 따옴표에 의해 생성 된 문자열은 지원하지 않습니다 문자열 interpollation을 하고 이스케이프 시퀀스를하지 않습니다.

깔끔한 예는 다음과 같습니다.

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

이므로

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

작은 따옴표로 보간하는 것은 전혀 작동하지 않습니다.

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

모범 사례

대부분의 Ruby Linters는 문자열에 작은 따옴표 리터럴을 사용 하고 보간 / 이스케이프 시퀀스의 경우 큰 따옴표 리터럴을 사용하도록 제안 합니다 .


1
따라서 만약 당신이 a = '\ n'이고 b = "# {a}"라면, b는 줄 바꾸기 또는 이스케이프 시퀀스로 해석됩니까?
NathanTempelman

4
a = '\ n'을 할당하는 순간 a는 a를 b로 삽입하여 "\\ n"으로 해석되며 새로운 줄을 얻지 못합니다. b는 "\\ n"으로 줄어 듭니다 (이스케이프 시퀀스를 얻는 새 줄 없음). a = '\ n'=> "\\ n"여기서 a = "\ n"=> "\ n"
aloucas

6

작은 따옴표로 묶인 문자열은 ASCII 이스케이프 코드 (\ n, \ t 등)를 처리하지 않으며 큰 따옴표로 묶인 문자열은 문자열 보간을 수행하지 않습니다.

이스케이프 코드 예제 :

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

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

보간 예 :

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

인쇄의 대답 "\ n"과 유사하게 다음과 같은 차이점이 있습니다.

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

그래서 *는 큰 따옴표로 이스케이프 된 문자로 변환되었지만 작은 따옴표는 아닌 것처럼 보입니다. BTW, 정규 표현식에서 사용할 때 출력에 영향을 미칩니다. 예 : str.gsub (/ regular expression /, '\ 1, \ 2')


2

작은 따옴표를 사용하려는 또 다른 이유는 정규식 패턴을 문자열로 전달할 때입니다.

이 정규식 패턴은 작은 따옴표 안에 전달되기 때문에 작동합니다.

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

이 정규식 패턴은 큰 따옴표 안에 전달되었으므로 실패합니다 (작동하려면 두 번 이스케이프해야 함).

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

-8

이 특정 경우에는 작성 방법에 차이가 없습니다. 그것들은 동등합니다. 또한 루비 가이드 / 튜토리얼을 더 읽어보고 싶을 수도 있습니다. :)


4
큰 따옴표는 문자열 해석을 허용하므로 동등하지 않습니다.
Jason Noble

7
매우 영리한 관찰을하기 전에 "이 특정한 경우"부분을 읽었습니까?
Geo

9
그렇습니다. 그러나 그의 질문은 작은 따옴표와 큰 따옴표를 언제 사용해야하는지였습니다.
Jason Noble
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.