Ruby上的<< – 运算符,它在哪里记录?

我最近使用<< – 运算符输出多行字符串,如下所示:

<<-form 

Name to say hi!

form

但我从一些开源代码中偷走了<< – 运算符,但我没有找到任何关于它的文档。

我有点想通知它和bash一样:

 $ cat <> form.html > 

Name to say hi!

>
> > >
> EOF

这样做有用吗? 我只是想找到它的文档。

来自Ruby编程语言

这里的文件

对于长字符串文字,可能没有单个字符分隔符可以使用而不必担心记住在文字中转义字符。 Ruby对此问题的解决方案是允许您指定任意字符序列作为字符串的分隔符。 这种文字借用了Unix shell语法,在历史上称为here文档 。 (因为文档就在源代码中,而不是在外部文件中。)

这里的文件以<<<<-开头。 通过指定结束分隔符的标识符或字符串立即跟踪这些(不允许空格,以防止与左移运算符的歧义)。 字符串文字的文本从下一行开始并一直持续到分隔符的文本单独出现在一行上。 例如:

 document = < 

Ruby解释器通过从输入中一次读取一行来获取字符串文字的内容。 然而,这并不意味着<<必须是它自己的最后一件事。 实际上,在阅读了这里的文档内容后,Ruby解释器会回到它所在的行并继续解析它。 例如,以下Ruby代码通过连接两个here文档和一个常规的单引号字符串来创建一个字符串:

 greeting = < 

第1行的<使解释器读取第2行和第3行。 <使解释器读取第4行和第5行。读取这些行后,将三个字符串文字连接成一个。

这里文档的结尾分隔符实际上必须单独出现在一行上:分隔符后面没有注释。 如果here文档以<<开头,那么分隔符必须从行的开头开始。 如果文字以<<-开头,那么分隔符可能在它前面有空格。 here文档开头的换行符不是文字的一部分,但文档末尾的换行符是。 因此,每个此处的文档都以行终止符结束,除了此处为空的文档,它与""相同:

 empty = < 

如果使用不带引号的标识符作为终止符(如前面的示例中所示),则here文档的行为类似于双引号字符串,用于解释反斜杠转义符和#字符。 如果你想要非常非常直观,不允许任何转义字符,请将分隔符放在单引号中。 这样做还允许您在分隔符中使用空格:

 document = <<'THIS IS THE END, MY ONLY FRIEND, THE END' . . lots and lots of text goes here . with no escaping at all. . THIS IS THE END, MY ONLY FRIEND, THE END 

分隔符周围的单引号暗示此字符串文字就像单引号字符串。 事实上,这种文件甚至更严格。 因为单引号不是分隔符,所以永远不需要使用反斜杠转义单引号。 并且因为反斜杠永远不需要作为转义字符,所以永远不需要逃避反斜杠本身。 因此,在这种类型的文档中,反斜杠只是字符串文字的一部分。

您还可以使用双引号字符串文字作为here文档的分隔符。 这与使用单个标识符相同,只是它允许分隔符内的空格:

 document = <<-"# # #" # This is the only place we can put a comment #{title}  

#{title}

#{body} # # #

请注意,除了在<<标记之后和文字开头之前的第一行之外,无法在此文档中包含注释。 在此代码中的所有#字符中,一个引入注释,三个插入表达式到文字中,其余的是分隔符

这是Ruby“ here document ”或heredoc语法。 添加 – 表示缩进。

你无法在<<-运算符上找到任何文档的原因是因为它不是运算符。 它是字面语法,如'"

具体来说,它是这里的文档语法,它是Ruby中字符串文字的众多语法forms之一。 这里的Ruby文档类似于POSIX sh这里的文档,但是删除空白的处理是不同的:在POSIX中这里的文档由<<-分隔,只删除了前导标签 ,但它们是从字符串的内容中删除的,而在Ruby中删除所有前导空格,但仅从分隔符中删除。

这篇文章将告诉你关于“heredoc”字符串语法需要知道的一切。 此外,您可以查看rubydoc页面以获取字符串语法。