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

igo*_*gue 12 ruby operators

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

<<-form
  <h1>Name to say hi!</h1>
  <form method="post">
    <input type="text" name="name">
    <input type="submit" value="send">
  </form>
form
Run Code Online (Sandbox Code Playgroud)

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

我有点想通知它和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
Run Code Online (Sandbox Code Playgroud)

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

JRL*_*JRL 24

来自Ruby编程语言:

这里的文件

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

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

document = <<HERE        # This is how we begin a here document
This is a string literal.
It has two lines and abruptly ends...
HERE
Run Code Online (Sandbox Code Playgroud)

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

greeting = <<HERE + <<THERE + "World"
Hello
HERE
There
THERE
Run Code Online (Sandbox Code Playgroud)

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

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

empty = <<END
END
Run Code Online (Sandbox Code Playgroud)

如果使用不带引号的标识符作为终止符,如前面的示例所示,则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
Run Code Online (Sandbox Code Playgroud)

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

您还可以使用双引号字符串文字作为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>
               # # #
Run Code Online (Sandbox Code Playgroud)

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