Mengapa interpolasi string berfungsi di Ruby jika tidak ada tanda kurung kurawal?

90

Cara yang tepat untuk menggunakan interpolasi string di Ruby adalah sebagai berikut:

name = "Ned Stark"
puts "Hello there, #{name}" #=> "Hello there, Ned Stark"

Itulah cara saya ingin selalu menggunakannya.

Namun, saya telah memperhatikan sesuatu yang aneh dalam interpolasi string Ruby. Saya perhatikan bahwa interpolasi string berfungsi di Ruby tanpa tanda kurung kurawal sehubungan dengan variabel instan. Sebagai contoh:

@name = "Ned Stark"
puts "Hello there, #@name" #=> "Hello there, Ned Stark"

Dan mencoba hal yang sama sebagai variabel non-instance tidak berhasil.

name = "Ned Stark"
puts "Hello, there, #name" #=> "Hello there, #name"

Saya telah mencoba ini dengan sukses di 1.9.2 dan 1.8.7.

Mengapa ini berhasil? Apa yang dilakukan penerjemah di sini?

Charles Caldwell
sumber

Jawaban:

103

Menurut The Ruby Programming Language oleh Flanagan dan Matsumoto:

Jika ekspresi yang akan diinterpolasi ke dalam string literal hanyalah referensi ke variabel global, instance atau kelas, maka kurung kurawal dapat dihilangkan.

Jadi yang berikut ini semestinya berfungsi:

@var = "Hi"
puts "#@var there!"  #=> "Hi there!"

@@var = "Hi"
puts "#@@var there!" #=> "Hi there!"

$var = "Hi"
puts "#$var there!"  #=> "Hi there!"
tsherif
sumber
4
Pertanyaan keren, btw. Sangat menyenangkan untuk kembali dan menemukan sudut-sudut kecil dari bahasa yang telah saya lupakan.
tsherif
2
Meskipun jawaban Anda tidak berisi alasan mengapa atau apa yang terjadi, saya merasa alasannya sulit untuk dipastikan. Bahkan papan pesan lama yang sering dikomentari Matz tidak membantu. Namun, jawaban Anda menunjukkan bahwa itu adalah fitur yang bukan hanya kebetulan.
Charles Caldwell
1
Saya tidak yakin apa yang Anda harapkan sebagai alasan. Apakah yang Anda maksud sebagai keputusan desain? Dugaan saya adalah bahwa itu adalah percobaan sintaks yang mirip Perl , karena saya percaya Ruby awalnya dipahami sebagai semacam Perl ++ sebelum menjadi miliknya sendiri.
tsherif
2
Saya seorang noob lengkap dan baru saja IDE saya mengeluh tentang saya melakukan ini. Tapi saya kesulitan meyakinkan diri sendiri bahwa itu gaya yang bagus. Ini tidak konsisten dan memiliki sisi negatif - misalnya jika saya memiliki variabel instan @distance dengan nilai 100 dan ingin membuat string yang mengatakan sesuatu seperti "100m" menggunakan ekspresi seperti "# @ distancem" Saya hanya akan mendapatkan string kosong karena tidak ada variabel instan 'distancem'. Jadi ini terdengar seperti gaya yang buruk.
terriblememory
3
@terriblememory Oh itu pasti gaya yang buruk. Itulah mengapa saya memulai pertanyaan saya dengan menunjukkan cara yang benar untuk melakukannya. Namun, saya merasa aneh bahwa itu adalah fitur bahasa sama sekali dan bertanya-tanya mengapa itu berhasil. Selain itu, juga merupakan gaya yang buruk untuk memulai kalimat dengan konjungsi. Tetapi Anda masih akan melihat orang-orang menggunakannya di sana-sini. =)
Charles Caldwell