2012-06-03 53 views
6

我在維基百科找到了這個代碼塊,作爲在Ruby中作爲quine(打印自己的程序)的例子。瞭解ruby quine

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

但是,我不明白它的工作原理。特別是,我不明白的是,當我刪除的最後一行,我得到這個錯誤:

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

在這些線路會發生什麼?

回答

6

<<something語法開始一個這裏文檔,從UNIX借來的定義字符串shell通過Perl - 它基本上是一個多行字符串文字,在<<之後的行上開始,當行以something開頭時結束。

所以在結構上,這個計劃只是這樣做:

puts str*2,2 

...也就是說,打印str兩個副本之後但2

不是變量str的數量,這是包括一個文字字符串通過這裏的文檔,其結尾哨兵也是數字2:

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

因此,它打印出兩個字符串的副本(因爲用於打印出來的方法是puts,所有這些東西都會自動附加一個換行符。)

+0

但是,如果字符串的結束標記是「<」那麼它不應該是'2 * 2,2'序列,並且在最後一行中使用相同的序列來結束它? – SasQ

+0

<< <<的優先級比'*'更緊,所以'<< 2 * 2'是「以下以2結尾的文檔所代表的字符串乘以2」而不是「由以下代表的字符串2 * 2在這裏終止文件。「 –

1

在Ruby中,你可以用

str = <<DELIMITER 
    long string 
    on several 
    lines 
DELIMITER 

我想,從這裏,你可以猜到,其餘:)