什么是代码中的“<< - ”?

时间:2015-05-04 00:39:22

标签: ruby-on-rails ruby railscasts

这段代码取自Ryan Bates的Railscast第343集,内容是关于PostgreSQL中的全文搜索。我想理解它,但我在<<-运算符上找不到任何内容(如果它甚至是运算符)。有人可以指点我到可以了解的地方吗?

rank = <<-RANK
  ts_rank(to_tsvector(name), plainto_tsquery(#{sanitize(query)})) +
  ts_rank(to_tsvector(content), plainto_tsquery(#{sanitize(query)}))
RANK

2 个答案:

答案 0 :(得分:5)

它是ruby中的多行字符串,内容被内插,然后在PostgreSQL中执行。这是在命令行上运行脚本的标准方法。我用它来从Capistrano中编写AWS Scripts。

它使用here-doc语法。

http://blog.jayfields.com/2006/12/ruby-multiline-strings-here-doc-or.html

http://ruby-doc.org/core-2.2.0/doc/syntax/literals_rdoc.html#label-Here+Documents

答案 1 :(得分:2)

它的正式名称是heredoc,您可以通过两种不同的方式使用它们。 一个是如何将其布置在开头为<<-NAME的位置,结尾将简单为NAME

另一种方法是<<NAME,但在关闭时你必须确保线上NAME之前没有空格。下面的一些示例代码显示了差异。

def sample_method
    heredoc1 = <<-NAME
        This is a sample heredoc
    NAME

    heredoc2 = <<OTHERHEREDOC
        Both of these are the same thing
OTHERHEREDOC
end

这两个都可以作为heredocs,但正如你所看到的那样,第二个看起来有点丑陋。在您自己使用时选择您喜欢的任何一种,但如果您不包括短划线,请务必注意空白区域和字符串分隔符的结尾。