Cotações duplas vs simples

171

Estou muito novo para Ruby e eu estou tentando entender se há um tempo específico quando devo usar ""vs ''.

Eu tenho usado aspas simples na maioria das vezes porque é mais fácil digitar, mas não tenho certeza se devo.

por exemplo, get 'user/new'vsget "user/new"

imjp
fonte
12
Você tem certeza de que esta é uma pergunta sobre RoR, e não apenas sobre Ruby?
Ignacio Vazquez-Abrams
Existe um guia de estilo relevante para escolher quando a interpolação de cadeias não é necessária?
William Entriken

Respostas:

202

" " permite fazer interpolação de strings, por exemplo:

world_type = 'Mars'
"Hello #{world_type}"
Jits
fonte
1
Então, basicamente, use aspas duplas o tempo todo, certo?
nekonari
8
Não - aspas duplas simplesmente permitem interpolação de string. Se você não deseja interpolação de string, não use aspas duplas.
Panh
4
Não há razão para usar aspas duplas apenas quando você precisar de interpolação, não há impacto significativo no desempenho e isso fará com que você pense o que deve usar. Basta usar cadeias de caracteres entre aspas.
Matheus
137

exceto a interpolação, outra diferença é que a 'sequência de escape' não funciona entre aspas simples

puts 'a\nb' # just print a\nb 
puts "a\nb" # print a, then b at newline 
lfx_cool
fonte
42
Exceto por escaparem de aspas simples, por exemplo 'don\'t'.
Sparhawk 23/05
3
Esta é uma resposta muito útil para este qvestion. Eu nunca percebi que as aspas simples eram para imprimir literalmente tudo entre as aspas simples, com exceção das aspas que precisam ser escapadas. Obrigado.
21413 Jay Godse
6
E a barra invertida também tenta. puts '\\'Ele imprimirá apenas uma barra. veja aqui stackoverflow.com/questions/25499046/…
Hardik
Sim, são os dois únicos casos em que você pode escapar com aspas simples
Alexis
@Alexis não tenho certeza, talvez uma pequena diferença no desempenho
lfx_cool
40

Para responder sua pergunta, você deve usar ""quando quiser fazer uma interpolação de string:

a = 2
puts "#{a}"

Use aspas simples caso contrário.

Além disso, se você está se perguntando se há uma diferença em termos de desempenho, há uma excelente pergunta sobre isso no StackOverflow.

E se você é realmente novo no RoR, peço que você compre um livro decente sobre Ruby para aprender o básico do idioma. Isso o ajudará a entender o que está fazendo (e evitará que você pense que o Rails é mágico). Eu pessoalmente recomendo o Rubyist bem fundamentado .

Amokrane Chentir
fonte
34

Há uma diferença entre ''aspas simples e duplas ""no Ruby em termos do que deve ser avaliado em uma string.

Inicialmente, gostaria de esclarecer que, na forma literal de uma string, qualquer coisa entre aspas simples ou duplas é avaliada como um objeto de string, que é uma instância da classe Ruby String.

Portanto, 'stackoverflow'e "stackoverflow"ambos avaliarão instâncias da classe String sem nenhuma diferença .

A diferença

A diferença essencial entre as duas formas literais de strings (aspas simples ou duplas) é que aspas duplas permitem seqüências de escape, enquanto aspas simples não!

Um literal de cadeia criado por aspas simples não suporta interpolação de cadeia e não escapa seqüências.

Um exemplo interessante é:

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

enquanto que

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

A interpolação com aspas simples não funciona:

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

Melhor prática

Como a maioria dos Ruby Linters sugere usar literais de aspas simples para suas seqüências de caracteres e ir para os duplos no caso de seqüências de interpolação / escape.

aloucas
fonte
1
Portanto, se você tivesse a = '\ n' eb = "# {a}", b seria interpretado como uma nova linha ou como a sequência de escape?
NathanTempelman
4
No momento em que você atribui a = '\ n' a é interpretado como "\\ n" interpolando a para b, você não obterá uma nova linha. b será avaliado para "\\ n" (nenhuma nova linha você obtém a sequência de escape). a = '\ n' => "\\ n" em que como a = "\ n" => "\ n"
aloucas
6

As strings de aspas simples não processam códigos de escape ASCII (\ n, \ t etc) e não fazem interpolação de strings enquanto as aspas duplas fazem as duas coisas.

Exemplo de código de escape:

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

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

Exemplo de interpolação:

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
fonte
4

Semelhante à resposta "\ n" na impressão, a seguir é outro caso da diferença

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

parece que * foi convertido em caractere de escape entre aspas duplas, mas não entre aspas simples. BTW, afetará a saída ao usar na expressão regular, por exemplo, str.gsub (/ expressão regular /, '\ 1, \ 2')

Bryan Liu
fonte
2

Outro motivo pelo qual você deseja usar aspas simples é ao passar um padrão regex como uma string:

Esse padrão de regex funcionará porque passou entre aspas simples:

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

Esse padrão regex falhará porque passou entre aspas duplas (você precisaria escapar duas vezes para fazê-lo funcionar):

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

Nesse caso específico, não faz diferença a maneira como você o escreve. Eles são equivalentes. Além disso, você pode ler mais alguns guias / tutoriais em Ruby :)

Geo
fonte
4
Eles não são equivalentes, pois aspas duplas permitem a interpretação de strings.
Jason Noble
7
Você leu a parte "Neste caso específico", antes de fazer essa observação extremamente inteligente?
Geo
9
Sim, mas sua pergunta era quando usar aspas simples e duplas.
Jason Noble