【问题标题】:Can someone explain this ruby code?有人可以解释这个红宝石代码吗?
【发布时间】:2011-09-09 17:36:36
【问题描述】:

从轨道postgresql_adapter.rb。我明白它想要做什么,我只是不明白它是如何发生的。这真的与我迷路的

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

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

【问题讨论】:

  • 不,我理解上面提到的 sn-p 部分......但我不知道你可以在函数参数中使用它
  • 啊,你做到了。重读时,我对能够将heredoc 作为论据并不感到特别惊讶。

标签: ruby syntax heredoc


【解决方案1】:

您可以在一行中的任何位置(甚至多次)使用heredoc-marker(例如您的示例中的&lt;&lt;-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")

【讨论】:

  • 这太奇怪了!我完全不明白你为什么要这样做。为什么不把你的字符串分配给一个变量然后在函数中使用它呢?
  • @brad:我不会,但我想这种可能性是存在的,因为它更加简洁(红宝石有时会变得很烂)。
猜你喜欢
  • 2014-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多