2012-06-03 55 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 

我想,从这里,你可以猜到,其余:)