了解红宝石quine

时间:2012-06-03 19:42:06

标签: ruby heredoc quine

我在维基百科上发现了这个代码块,作为一个在Ruby中打印的quine(打印程序)的例子。

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

但是,我不知道它是如何工作的。特别是,我没有得到的是,当我删除最后一行时,我收到此错误:

  

语法错误,意外的$ end,期待tSTRING_CONTENT或tSTRING_DBEG或tSTRING_DVAR或tSTRING_END

这些行会发生什么?

2 个答案:

答案 0 :(得分:6)

<<something语法从 here-document 开始,通过Perl从UNIX shell中借用 - 它基本上是一个多行字符串文字,从<<之后的行开始并结束当一行以something开头时。

结构上,该计划只是这样做:

puts str*2,2

...也就是说,打印两份str后跟数字2。

但是它不是变量str,而是通过here-document包含一个文字字符串,其结尾的sentinel也是数字2:

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

因此它打印出字符串puts <<2*2,2的两个副本,然后是2.(因为用于打印出来的方法是puts,所以这些内容中的每一个都会自动附加换行符。 )

答案 1 :(得分:1)

在ruby中,您可以使用

定义字符串
str = <<DELIMITER
  long string
  on several
  lines
DELIMITER

我想从这里开始,您可以猜到其余部分:)