【问题标题】:The <<- operator on Ruby, where is it documented?Ruby 上的 <<- 运算符,它在哪里记录?
【发布时间】:2010-12-11 06:38:01
【问题描述】:

我最近使用

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

但是我从一些开源代码中窃取了

我发现它的工作方式与 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

它是这样工作的吗?我只是想找到有关它的文档。

【问题讨论】:

标签: ruby operators


【解决方案1】:

来自The Ruby Programming Language

这里的文档

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

此处的文档以&lt;&lt;&lt;&lt;- 开头。紧随其后的是指定结束分隔符的标识符或字符串(不允许空格,以防止与左移运算符产生歧义)。字符串文字的文本从下一行开始,一直持续到分隔符的文本单独出现在一行上。例如:

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

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

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

第 1 行的 &lt;&lt;HERE 导致解释器读取第 2 行和第 3 行。&lt;&lt;THERE 导致解释器读取第 4 和 5 行。读取这些行之后,三个字符串文字连接为一个.

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

empty = <<END
END

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

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文件更加严格。因为单引号不是分隔符,所以永远不需要用反斜杠转义单引号。并且因为从不需要反斜杠作为转义字符,所以从不需要转义反斜杠本身。因此,在这种 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>
               # # #

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

【讨论】:

    【解决方案2】:
    【解决方案3】:

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

    【讨论】:

    • 谢谢你,我什至不知道那是什么名字:)
    • 链接中的section about Ruby 是迄今为止我找到的最佳来源。谢谢!
    【解决方案4】:

    您在&lt;&lt;- 运算符上找不到任何文档的原因是它不是运算符。它是文字语法,例如 '"

    具体来说,它是 here document 语法,它是 Ruby 中字符串文字的众多语法形式之一。 Ruby here 文档类似于 POSIX sh here 文档,但空格删除的处理不同:在 POSIX sh here 文档中,由&lt;&lt;- 分隔,仅删除了前导 tabs,但它们是从字符串的 contents 中删除,而在 Ruby all 中,前导空格被删除,但仅从 delimiter 中删除。

    【讨论】:

      【解决方案5】:

      This post 将告诉您有关“heredoc”字符串语法的所有信息。另外,可以view the rubydoc page进行字符串语法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-21
        • 1970-01-01
        • 1970-01-01
        • 2019-12-23
        • 1970-01-01
        • 2021-08-11
        • 2018-03-27
        • 1970-01-01
        相关资源
        最近更新 更多