有人可以解释这个红宝石代码吗?

时间:2011-06-07 01:48:54

标签: ruby syntax heredoc

从导轨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

但我从未在函数调用的参数中看到过这种情况。我真的很困惑。有人可以向我解释一下究竟发生了什么吗?

1 个答案:

答案 0 :(得分:13)

你可以在一行中的任何地方(甚至多次)使用heredoc标记(例如你的例子中的<<-SQL),然后heredoc将从下一行开始并继续直到满足结束标记(在多个标记的情况下,第(n + 1)个heredoc将在第n个末端标记之后开始并继续到第(n + 1)个末端标记)。然后将每个heredoc的内容插入使用相应标记的位置。

所以

foo(<<BAR, 42)
bar
BAR

相同
foo("bar\n", 42)

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

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