小编典典

Ruby:我可以编写不连接的多行字符串吗?

all

有没有办法让这看起来更好一点?

conn.exec 'select attr1, attr2, attr3, attr4, attr5, attr6, attr7 ' +
          'from table1, table2, table3, etc, etc, etc, etc, etc, ' +
          'where etc etc etc etc etc etc etc etc etc etc etc etc etc'

就像,有没有办法暗示连接?


阅读 119

收藏
2022-03-14

共1个答案

小编典典

这个答案的某些部分帮助我得到了我需要的东西(简单的多行连接没有额外的空格),但由于没有一个实际的答案有它,我在这里编译它们:

str = 'this is a multi-line string'\
  ' using implicit concatenation'\
  ' to prevent spare \n\'s'

=> "this is a multi-line string using implicit concatenation to eliminate spare
\\n's"

作为奖励,这是一个使用有趣的 HEREDOC 语法的版本(通过此链接):

p <<END_SQL.gsub(/\s+/, " ").strip
SELECT * FROM     users
         ORDER BY users.id DESC
END_SQL
# >> "SELECT * FROM users ORDER BY users.id DESC"

后者主要用于在处理过程中需要更大灵活性的情况。我个人不喜欢它,它把处理放在字符串的一个奇怪的地方(即在它前面,但使用通常在后面出现的实例方法),但它就在那里。请注意,如果您要缩进最后一个END_SQL标识符(这很常见,因为它可能在函数或模块内),您将需要使用连字符语法(即,p <<-END_SQL而不是p <<END_SQL)。否则,缩进空格会导致标识符被解释为字符串的延续。

这并没有节省多少打字,但对我来说,它看起来比使用 + 号更好。

另外(我在几年后的编辑中说),如果您使用的是 Ruby 2.3+,则运算符
<<~也可用,它会从最终字符串中删除额外的缩进。在这种情况下,您应该能够删除.gsub调用(尽管它可能取决于起始缩进和您的最终需求)。

编辑:再添加一个:

p %{
SELECT * FROM     users
         ORDER BY users.id DESC
}.gsub(/\s+/, " ").strip
# >> "SELECT * FROM users ORDER BY users.id DESC"
2022-03-14