2012-06-03 5 views
6

Bu kod bloğunu, Ruby'deki bir quine (kendini yazdıran program) örneği olarak Wikipedia'da buldum.Ruby quine'ı anlama

puts <<2*2,2 
puts <<2*2,2 
2 

Ancak, nasıl çalıştığını anlamıyorum.

syntax error, unexpected $end, expecting tSTRING_CONTENT or tSTRING_DBEG or tSTRING_DVAR or tSTRING_END

bu satırlarda ne olur: Özellikle, ne alamadım ben son satırı kaldırdığınızda, bu hatayı elde ediyoruz?

cevap

6

<<something sözdizimi UNIX ödünç bir burada-belge başlar tahmin edebilirsiniz herhalde

str = <<DELIMITER 
    long string 
    on several 
    lines 
DELIMITER 

dizelerle tanımlayabilirsiniz Perl ile kabuklar - temelde <<'dan sonra hat üzerinde başlayan ve something ile bir satır başladığında sona eren çok satırlı bir dize değişmezidir. Yani yapısal olarak

program sadece bu yapıyor:

puts str*2,2 

... yani, yazdırma 2.

Ama bunun yerine değişken str sayısının ardından str iki kopyası, bu kadar

puts <<2*2,2 
puts <<2*2,2 
2 

Yani dize iki kopyasını yazdırır: biten nöbetçi bir buraya-doküman aracılığıyla değişmez bir dize içeren ayrıca basamaklı 2'dir puts <<2*2,2, ardından bir 2. (Ve bunları yazdırmak için kullanılan yöntem puts olduğu için, bu şeylerin her biri otomatik olarak eklenen bir satır sonu alır.)

+0

Ancak dizenin bitiş işareti " <2, o zaman 2 * 2,2 'dizisi olmamalı ve son satırı sonlandırmak için aynı sıra kullanılır mı? – SasQ

+0

'<<' nin önceliği, * * 'den daha sıkıdır, bu nedenle <2 2 * 2'," aşağıdaki 2-sonlandırılmış belgeyle temsil edilen dizidir, 2 ile çarpılır "yerine" dizgesi "ile gösterilir Buraya 2 * 2 sonlandırıldı. " –

1

yakut, sen buradan, gerisini :)