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

bra*_*rad 4 ruby syntax heredoc

来自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
Run Code Online (Sandbox Code Playgroud)

我之前看过代码你可以说:

blah = <<-X
 some
 lines
 of
 test
X
Run Code Online (Sandbox Code Playgroud)

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

sep*_*p2k 13

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

所以

foo(<<BAR, 42)
bar
BAR
Run Code Online (Sandbox Code Playgroud)

是相同的

foo("bar\n", 42)
Run Code Online (Sandbox Code Playgroud)

foo(<<BAR, <<BAZ)
bar
BAR
baz
BAZ
Run Code Online (Sandbox Code Playgroud)

是相同的

foo("bar\n", "baz\n")
Run Code Online (Sandbox Code Playgroud)