Ruby'de küme parantezi olmadığında dize enterpolasyonu neden çalışır?


91

Ruby'de dize enterpolasyonunu kullanmanın uygun yolu aşağıdaki gibidir:

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

Bu onu her zaman kullanmayı düşündüğüm yol

Ancak, Ruby'nin dize enterpolasyonunda tuhaf bir şey fark ettim . Örnek değişkenleriyle ilgili olarak string enterpolasyonunun Ruby'de kaşlı ayraçlar olmadan çalıştığını fark ettim. Örneğin:

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

Örnek olmayan bir değişkenle aynı şeyi denemek işe yaramaz.

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

Bunu hem 1.9.2 hem de 1.8.7'de başarıyla denedim.

Bu neden işe yarıyor? Tercümanın burada ne işi var?

Yanıtlar:


104

Göre Ruby Programlama Dili Flanagan ve Matsumoto tarafından:

Dize değişmezine eklenecek ifade basitçe bir genel, örnek veya sınıf değişkenine referans olduğunda, küme parantezleri atlanabilir.

Yani aşağıdakilerin tümü çalışmalıdır:

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

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

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

4
Harika soru, btw. Geri dönüp unuttuğum dilin küçük köşelerini bulmak güzel.
tsherif

2
Cevabınız niçin ya da ne olduğunun bir nedenini içermese de, nedenini tespit etmenin zor olduğunu görüyorum. Matz'ın sık sık yorum yaptığı eski mesaj panoları bile yardımcı olmuyor. Ancak, cevabınız bunun sadece bir şans değil, bir özellik olduğunu gösteriyor.
Charles Caldwell

1
Yine de bir sebep olarak ne beklediğinizden emin değilim. Tasarım kararı olarak mı demek istiyorsun? Benim tahminim , Ruby'nin kendi haline gelmeden önce bir tür Perl ++ olarak tasarlandığına inandığım için, Perl benzeri bir sözdizimi girişimiydi .
tsherif

2
Tam bir noob'um ve IDE'm bunu yapmamdan şikayetçi oldu. Ama bunun iyi bir tarz olduğuna kendimi ikna etmek için zor bir işim var. Anlamsız bir şekilde tutarsızdır ve bir dezavantajı vardır - örneğin, @distance 100 değerine sahip bir örnek değişkenim varsa ve "# @ distancem" gibi bir ifade kullanarak "100m" gibi bir şey söyleyen bir dize yapmak istersem, sadece boş bir dize alırım çünkü örnek değişkeni 'distancem' yoktur. Yani bu tamamen kötü bir tarz gibi geliyor.
terriblememory

3
@terriblememory Oh bu kesinlikle kötü bir stil. Bu yüzden soruma onu yapmanın doğru yolunu göstererek başladım. Ancak, bunun dilin bir özelliği olması garip buldum ve neden işe yaradığını merak ettim. Sonra tekrar, bir cümleye bir bağlaçla başlamak da kötü bir tarzdır. Ama yine de insanların onu burada ve orada kullandığını göreceksiniz. =)
Charles Caldwell
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.