有人能解释一下这段Ruby代码吗?

4

这段文本来自rails的 postgresql_adapter.rb。我明白它想做什么,但我不明白它是如何实现的。这实际上与 <<-SQL 有关,而我对此感到困惑。

exec_query(<<-SQL, 'SCHEMA', binds).rows.first[0].to_i > 0
  SELECT COUNT(*)
  FROM pg_tables
  WHERE tablename = $1
  #{schema ? "AND schemaname = $2" : ''}
SQL

我之前见过一些代码,其中可以这样写:

blah = <<-X
 some
 lines
 of
 test
X

但我从未见过这样在函数调用的参数中使用。我真的很困惑。有人能向我解释一下这里到底发生了什么吗?


可能是这个Ruby片段做什么?的重复。 - Andrew Grimm
不,我理解了你提到的代码片段部分... 但是我不知道你可以在函数参数中使用它。 - brad
啊,原来是这样。重新阅读后,我并不感到意外能够将heredoc作为参数。 - Andrew Grimm
1个回答

13

您可以使用一个here document marker(例如在您的示例中的<<-SQL)放置在一行的任何位置(甚至多次出现),然后该here document将从下一行开始,并继续到遇到结束标记为止(对于多个标记,第n+1个here document将在第n个结束标记之后开始,并一直持续到第n+1个结束标记)。然后,每个here document的内容将插入到相应标记所在的位置。

因此,

foo(<<BAR, 42)
bar
BAR

与之相同

foo("bar\n", 42)

并且

foo(<<BAR, <<BAZ)
bar
BAR
baz
BAZ

就是等同于

foo("bar\n", "baz\n")

这太奇怪了!我不明白为什么你要这样做。为什么不将你的字符串赋值给一个变量,然后在函数中使用它呢? - brad
@brad:我不会这样做,但我认为可能存在这种可能性,因为它有点更加简洁(Ruby有时可能会很像Perl)。 - sepp2k

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接