Может кто-нибудь объяснить этот рубиновый код? - PullRequest
4 голосов
/ 07 июня 2011

с рельсов postgresql_adapter.rb . Я понимаю, что он пытается сделать, я просто не понимаю, как это происходит. Это действительно связано с << - SQL, который я потерял. </p>

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 Ответ

13 голосов
/ 07 июня 2011

Вы можете использовать heredoc-маркер (например, <<-SQL в вашем примере) в любом месте (или даже несколько раз) в строке, и затем heredoc будет начинаться со следующей строки и продолжаться, пока не будет достигнут конечный маркер (в в случае нескольких маркеров (n + 1) -й heredoc начнется после n-го конечного маркера и продолжится до (n + 1) -ого конечного маркера). Содержимое каждого heredoc будет вставлено в то место, где использовался соответствующий маркер.

So

foo(<<BAR, 42)
bar
BAR

совпадает с

foo("bar\n", 42)

и

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

совпадает с

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