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

时间:2009-10-29 14:29:07

标签: ruby operators

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

<<-form
  <h1>Name to say hi!</h1>
  <form method="post">
    <input type="text" name="name">
    <input type="submit" value="send">
  </form>
form

但我从一些开源代码中偷走了&lt;&lt; - 运算符,但我没有找到任何文档。

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

$ cat <<EOF >> form.html
> <h1>Name to say hi!</h1>
> <form method="post">
>   <input type="text" name="name">
>   <input type="submit" value="send">
> </form>
> EOF

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

5 个答案:

答案 0 :(得分:24)

来自The Ruby Programming Language

  

此处文件

     

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

     

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

document = <<HERE        # This is how we begin a here document
This is a string literal.
It has two lines and abruptly ends...
HERE
     

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

greeting = <<HERE + <<THERE + "World"
Hello
HERE
There
THERE
     

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

     

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

empty = <<END
END
     

如果使用不带引号的标识符作为终止符,如前面的示例所示,则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
<html><head><title>#{title}</title></head>
<body>
<h1>#{title}</h1>
#{body}
</body>
</html>
               # # #
     

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

答案 1 :(得分:3)

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:-1)

This post会告诉您有关“heredoc”字符串语法的所有信息。此外,您可以view the rubydoc page获取字符串语法。