代码之家  ›  专栏  ›  技术社区  ›  igorgue

Ruby上的<<-操作符,它在哪里被记录?

  •  12
  • igorgue  · 技术社区  · 15 年前

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

    <<-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
    

    这样行吗?我只想在上面找到文件。

    5 回复  |  直到 8 年前
        1
  •  24
  •   Mark Amery Harley Holcombe    8 年前

    The Ruby Programming Language :

    这里的文件

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

    此处文档以开头 << <<- . 后面紧跟着一个标识符或指定结束分隔符的字符串(不允许有空格,以防止左移位运算符产生歧义)。字符串文字的文本从下一行开始,然后继续,直到分隔符的文本单独出现在一行上。例如:

    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
    

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

    此处文档的结束分隔符必须单独出现在一行上:分隔符后面不能有注释。如果此处文档以 << ,则分隔符必须从行首开始。如果文本以 <<- 相反,分隔符前面可能有空格。此处文档开头的换行符不是文本的一部分,但文档结尾的换行符是。因此,每个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文档中,反斜杠只是字符串文字的一部分。

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

    document = <<-"# # #"    # This is the only place we can put a comment
    <html><head><title>#{title}</title></head>
    <body>
    <h1>#{title}</h1>
    #{body}
    </body>
    </html>
                   # # #
    

    请注意,除了在此处文档的 << 在文字开始之前。在所有 # 在这段代码中,一个引入注释,三个插入表达式到文本中,其余的是分隔符。

        3
  •  2
  •   Jacob Mattison    15 年前

    这是红宝石” here document “或Heredoc语法。加上-表示缩进。

        4
  •  1
  •   Jörg W Mittag    15 年前

    您无法在 <<- 接线员是因为它不是接线员。它是字面语法,比如 ' " .

    具体来说,它是 这里文档 语法,这是Ruby中字符串文本的许多语法形式之一。这里的ruby文档类似于posix sh 这里是文档,但是删除空白的处理是不同的:在POSIX中 上海 此处文档由分隔 <<- 只有领导 制表符 已删除,但它们已从 内容 在字符串中,而在Ruby中 全部的 前导空格被删除,但仅从 定界符 .

        5
  •  -1
  •   Mark Embling    15 年前

    This post 将告诉您关于“HereDoc”字符串语法需要了解的所有信息。另外,你可以 view the rubydoc page 用于字符串语法。