Çift veya tek tırnak


172

Ruby için gerçekten yeniyim ve ""vs kullanmam gereken belirli bir zaman olup olmadığını anlamaya çalışıyorum ''.

Çoğu zaman tek tırnak kullanıyorum çünkü yazması daha kolay ama yapmam gerekip gerekmediğinden emin değilim.

örneğin get 'user/new'vsget "user/new"


12
Bunun sadece bir Ruby sorusu değil, bir RoR sorusu olduğundan emin misiniz?
Ignacio Vazquez-Abrams

Dize enterpolasyonunun ne zaman gerekli olmadığının seçilmesinde ilgili bir stil kılavuzu var mı?
William Entriken

Yanıtlar:


202

" " dize enterpolasyonu yapmanızı sağlar, örneğin:

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

1
Temel olarak, her zaman çift tırnak kullanın, değil mi?
nekonari

8
Hayır - çift tırnak işaretleri dize enterpolasyonuna izin verir. Dize enterpolasyonu istemiyorsanız, çift tırnak kullanmamalısınız.
Panh

4
Çift tırnakları yalnızca enterpolasyona ihtiyaç duyduğunuzda kullanmak için bir neden yoktur, önemli bir performans etkisi yoktur ve sadece ne kullanmanız gerektiğini düşündürür. Sadece çift tırnaklı dizeler kullanın.
Matheus

137

enterpolasyon hariç, bir başka fark 'kaçış dizisi' nin tek tırnakta çalışmadığıdır

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

42
Tek tırnaklardan kaçmak hariç, örn 'don\'t'.
Sparhawk

3
Bu soruya çok faydalı bir cevap. Tek tırnak işaretinin, kaçması gereken tırnak işaretleri dışında, tek tırnak işaretleri arasındaki her şeyi tam anlamıyla yazdırmak olduğunu hiç fark etmedim. Teşekkür ederim.
Jay Godse

6
Ve ters eğik çizgi de deneyin puts '\\'Sadece tek eğik çizgi yazdıracaktır. buraya bakın stackoverflow.com/questions/25499046/…
Hardik

evet, tek tırnak ile kaçabilir sadece iki durum mu
Alexis

@Alexis emin değilim, belki performans biraz fark
lfx_cool

40

Sorunuzu cevaplamak için ""dize enterpolasyonu yapmak istediğinizde kullanmanız gerekir :

a = 2
puts "#{a}"

Aksi takdirde basit tırnak işaretleri kullanın.

Ayrıca, performans açısından bir fark olup olmadığını merak ediyorsanız , StackOverflow'da bu konuda mükemmel bir soru var.

Ve eğer RoR'da gerçekten yeniyseniz, dilin temellerini öğrenmek için iyi bir Ruby kitabı almanızı tavsiye ederim. Ne yaptığınızı anlamanıza yardımcı olacaktır (ve sizi Rails'ın sihir olduğunu düşünmekten alıkoyacaktır). Şahsen iyi topraklanmış Rubyist öneririz .


34

Ruby'de tek ''ve çift tırnaklar ""arasında bir karakter dizisine neyin değerlendirileceğine dair bir fark vardır.

Başlangıçta, tek bir dize ya da çift tırnak arasındaki her ne olursa olsun Ruby String sınıfının bir örneği olan bir dize nesnesi olarak değerlendirilir bir dizenin gerçek biçiminde açıklığa kavuşturmak istiyorum .

Bu nedenle, 'stackoverflow've "stackoverflow"her ikisi de hiçbir fark olmadan String sınıfı örneklerini değerlendirecektir .

Fark

Dizelerin iki değişmez formu (tek veya çift tırnaklar) arasındaki temel fark , çift tırnakların tek tırnakların kaçmamasına rağmen kaçış dizilerine izin vermesidir!

Değişmezi tek tırnak yarattığı bir dize desteklemez dize interpollation ve dizileri kaçış yok.

Temiz bir örnek:

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

buna karşılık

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

Tek tırnak işaretleri ile enterpolasyon yapmak işe yaramıyor:

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

En iyi pratik

Ruby Linter'lerin çoğu, dizeleriniz için tek tırnak harfleri kullanmanızı ve enterpolasyon / kaçma dizileri durumunda çift tırnaklar için önerdiğinden .


1
Eğer bir = '\ n' ve b = "# {a}" varsa, b yeni bir satır mı yoksa kaçış sırası mı olarak yorumlanır?
NathanTempelman

4
A = '\ n' a atadığınız an, a'dan b'ye yorumlanarak "\\ n" olarak yorumlanırsa, yeni bir satır elde edemezsiniz. b "\\ n" olarak değerlendirilir (kaçış sırasını elde edeceğiniz yeni bir satır yoktur). a = '\ n' => "\\ n" burada a = "\ n" => "\ n" olarak
aloucas

6

Tek tırnaklı dizeler ASCII çıkış kodlarını (\ n, \ t vb.) İşlemez ve çift tırnaklı her ikisini de yaparken dize enterpolasyonu yapmazlar.

Kaçış kodu örneği:

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

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

İnterpolasyon örneği:

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

Baskıdaki "\ n" cevabına benzer şekilde, farkın başka bir örneği aşağıdadır

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

yani * çift tırnak içinde kaçan karakter dönüştürmek gibi görünüyor, ama tek tırnak içinde değil. BTW, düzenli ifadede kullanıldığında çıktıyı etkileyecektir, örneğin, str.gsub (/ düzenli ifade /, '\ 1, \ 2')


2

Tek tırnak işareti kullanmak istemenizin başka bir nedeni, normal ifade desenini dize olarak geçirmektir:

Bu normal ifade deseni tek tırnak içine alındığı için çalışacaktır:

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

Bu normal ifade deseni, çift tırnak içine alındığı için başarısız olur (işe yaraması için iki kez kaçmanız gerekir):

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

-8

Bu özel durumda, onu nasıl yazdığınız hiç fark etmez. Eşdeğerler. Ayrıca, daha fazla Ruby kılavuzu / öğreticisi okumak isteyebilirsiniz :)


4
Çift tırnaklar dize yorumlamasına izin verdiği için eşdeğer değildir.
Jason Noble

7
Son derece zeki bir gözlem yapmadan önce "Bu özel durumda" bölümünü okudunuz mu?
Geo

9
Evet, ama sorusu ne zaman tek ve çift tırnak kullanacağıydı.
Jason Noble
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.