Kutipan ganda vs tunggal


172

Aku benar-benar baru untuk Ruby dan aku mencoba untuk memahami jika ada waktu tertentu ketika saya harus menggunakan ""vs ''.

Saya telah menggunakan tanda kutip tunggal sebagian besar waktu karena lebih mudah untuk mengetik tapi saya tidak yakin apakah saya harus melakukannya.

misalnya get 'user/new'vsget "user/new"


12
Apakah Anda yakin ini adalah pertanyaan RoR, dan bukan hanya pertanyaan Ruby?
Ignacio Vazquez-Abrams

Apakah ada panduan gaya yang relevan untuk memilih saat interpolasi string tidak diperlukan?
William Entriken

Jawaban:


202

" " memungkinkan Anda melakukan interpolasi string, misalnya:

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

1
Jadi pada dasarnya, gunakan saja tanda kutip ganda sepanjang waktu, bukan?
nekonari

8
Tidak - tanda kutip ganda hanya memungkinkan interpolasi string. Jika Anda tidak ingin interpolasi string, maka Anda tidak harus menggunakan tanda kutip ganda.
Panh

4
Tidak ada alasan untuk menggunakan tanda kutip ganda hanya ketika Anda membutuhkan interpolasi, tidak ada dampak kinerja yang signifikan dan itu hanya akan membuat Anda berpikir apa yang harus Anda gunakan. Cukup gunakan string yang dikutip ganda.
Matheus

137

kecuali interpolasi, perbedaan lain adalah bahwa 'urutan pelarian' tidak bekerja dalam kutipan tunggal

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

42
Kecuali untuk melarikan diri dari tanda kutip tunggal sendiri, mis 'don\'t'.
Sparhawk

3
Ini adalah jawaban yang sangat berguna untuk pertanyaan ini. Saya tidak pernah menyadari bahwa satu-kutip adalah untuk mencetak segala sesuatu di antara tanda kutip tunggal, dengan pengecualian tanda kutip yang harus diloloskan. Terima kasih.
Jay Godse

6
Dan backslash juga mencoba. puts '\\'Ia hanya akan mencetak satu tebasan. lihat di sini stackoverflow.com/questions/25499046/…
Hardik

yup, apakah hanya dua kasus yang bisa Anda hindari dengan tanda kutip tunggal
Alexis

@Alexis tidak yakin, mungkin sedikit perbedaan pada kinerja
lfx_cool

40

Untuk menjawab pertanyaan Anda, Anda harus menggunakan ""ketika Anda ingin melakukan interpolasi string:

a = 2
puts "#{a}"

Gunakan kutipan sederhana sebaliknya.

Juga jika Anda bertanya-tanya apakah ada perbedaan dalam hal kinerja, ada pertanyaan bagus tentang ini di StackOverflow.

Dan jika Anda benar-benar baru dalam RoR, saya mendorong Anda untuk mengambil buku Ruby yang layak untuk mempelajari dasar-dasar bahasa. Ini akan membantu Anda memahami apa yang Anda lakukan (dan akan membuat Anda berpikir bahwa Rails itu ajaib). Saya pribadi merekomendasikan The Well grounded Rubyist .


34

Ada perbedaan antara ''tanda kutip tunggal dan ganda ""di Ruby dalam hal apa yang akan dievaluasi menjadi string.

Awalnya, saya ingin mengklarifikasi bahwa dalam bentuk literal string apa pun di antara tanda kutip tunggal atau ganda akan dievaluasi sebagai objek string, yang merupakan turunan dari kelas Ruby String.

Oleh karena itu, 'stackoverflow'dan "stackoverflow"keduanya akan mengevaluasi instance kelas String tanpa perbedaan sama sekali .

Perbedaan

Perbedaan mendasar antara dua bentuk string secara literal (tanda kutip tunggal atau ganda) adalah bahwa tanda kutip ganda memungkinkan untuk urutan-urutan pelarian sementara tanda kutip tunggal tidak!

String literal yang dibuat oleh tanda kutip tunggal tidak mendukung interpolasi string dan tidak luput dari urutan.

Contoh yang rapi adalah:

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

sedangkan

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

Interpolasi dengan tanda kutip tunggal tidak bekerja sama sekali:

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

Praktek terbaik

Seperti yang disarankan oleh sebagian besar Ruby Linters untuk menggunakan literal tanda kutip tunggal untuk string Anda dan pilih yang ganda dalam hal urutan interpolasi / pelolosan.


1
Jadi jika Anda memiliki a = '\ n' dan b = "# {a}", apakah b akan ditafsirkan sebagai baris baru atau sebagai urutan pelarian?
NathanTempelman

4
Saat Anda menetapkan a = '\ n' a ditafsirkan sebagai "\\ n" dengan menginterpolasi a ke b, Anda tidak akan mendapatkan baris baru. b akan mengevaluasi ke "\\ n" (tidak ada baris baru Anda mendapatkan urutan melarikan diri). a = '\ n' => "\\ n" di mana sebagai a = "\ n" => "\ n"
aloucas

6

Sebuah string yang dikutip tunggal tidak memproses kode ASCII escape (\ n, \ t dll), dan mereka tidak melakukan interpolasi string sementara yang dikutip ganda melakukan keduanya.

Contoh kode melarikan diri:

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

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

Contoh interpolasi:

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

Mirip dengan jawaban "\ n" dalam pencetakan, berikut ini adalah perbedaannya

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

jadi sepertinya * dikonversi menjadi karakter yang lolos dalam tanda kutip ganda, tetapi tidak dalam tanda kutip tunggal. BTW, itu akan berdampak pada output ketika menggunakan dalam ekspresi reguler misalnya, str.gsub (/ ekspresi reguler /, '\ 1, \ 2')


2

Alasan lain Anda ingin menggunakan tanda kutip tunggal adalah ketika meneruskan pola regex sebagai string:

Pola regex ini akan berfungsi karena dilewatkan dalam tanda kutip tunggal:

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

Pola regex ini akan gagal karena diteruskan dalam tanda kutip ganda (Anda harus meloloskan diri dua kali agar bisa berfungsi):

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

-8

Dalam kasus khusus ini, tidak ada bedanya bagaimana Anda menulisnya. Mereka setara. Juga, Anda mungkin ingin membaca beberapa panduan Ruby / tutorial :)


4
Mereka tidak setara, karena tanda kutip ganda memungkinkan untuk interpretasi string.
Jason Noble

7
Apakah Anda membaca bagian "Dalam kasus khusus ini", sebelum melakukan pengamatan yang sangat cerdas?
Geo

9
Ya, tapi pertanyaannya adalah kapan harus menggunakan tanda kutip tunggal vs ganda.
Jason Noble
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.