Ruby:我可以写多行string吗?

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

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' 

喜欢,有没有办法暗示串联?

这个答案有帮助我得到我需要的东西(简单的多行连接,没有额外的空格),但由于没有真正的答案,所以我在这里编译它们:

 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" 

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

这不会节省太多的打字,但它看起来比使用+符号更好,对我来说。

编辑:再添加一个:

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

是的,如果你不介意插入额外的换行符:

  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' 

或者,您可以使用heredoc :

 conn.exec <<-eos 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 eos 

在ruby 2.0中,你现在可以使用%

例如:

 SQL = %{ SELECT user, name FROM users WHERE users.id = #{var} LIMIT #{var2} } 

您已经阅读过多行string的多种语法。 我最喜欢的是Perl风格的:

 conn.exec %q{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} 

多行string以%q开头,后跟一个{,[或(,然后由相应的反转字符终止,%q不允许插值;%Q也可以这样写:

 conn.exec %Q{select attr1, attr2, attr3, attr4, attr5, attr6, attr7 from #{table_names}, where etc etc etc etc etc etc etc etc etc etc etc etc etc} 

实际上我不知道这些多行string是如何被调用的,所以我们把它们叫做Perl多行。

但是请注意,无论您使用Perl多行或heredocs作为马克和彼得build议,您将最终可能不必要的空格。 在我的例子和例子中,“from”和“where”这两行都包含了主要的空格,因为它们在代码中的缩进。 如果不需要这个空格,那么你必须像现在一样使用连接string。

有时是值得删除新行字符\n像:

 conn.exec <<-eos.squish 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 eos 
 conn.exec = <<eos 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 eos 

您也可以使用三个双引号

 x = """ this is a multiline string """ 2.3.3 :012 > x => "\nthis is\na multiline\nstring\n" 

如果需要删除换行符“\ n”,请在每行末尾使用反斜杠“\”

 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' 

<<是string的连接运算符

如果你介意额外的空格和换行符,你可以使用

 conn.exec %w{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} * ' ' 

(使用插入string的%W)

其他选项:

 #multi line string multiline_string = <<EOM This is a very long string that contains interpolation like #{4 + 5} \n\n EOM puts multiline_string #another option for multiline string message = <<-EOF asdfasdfsador #{2+2} this month. asdfadsfasdfadsfad. EOF puts message 
 conn.exec [ "select attr1, attr2, attr3, ...", "from table1, table2, table3, ...", "where ..." ].join(' ') 

这个build议比这里有优势 – 文档和长string,自动压缩器可以适当地缩进string的每个部分。 但是这是以效率为代价的。

为了避免closures每行的括号,可以简单地使用带反斜杠的双引号来转义换行符:

 "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" 

最近,随着Ruby 2.3的新function,新的squiggly HEREDOC将允许您以很好的方式编写我们的多行string,只需要很less的改动,所以使用这个和.squish结合.squish可以让您以很好的方式写多行!

 [1] pry(main)> <<~SQL.squish [1] pry(main)* select attr1, attr2, attr3, attr4, attr5, attr6, attr7 [1] pry(main)* from table1, table2, table3, etc, etc, etc, etc, etc, [1] pry(main)* where etc etc etc etc etc etc etc etc etc etc etc etc etc [1] pry(main)* SQL => "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" 

ref: https : //infinum.co/the-capsized-eight/multiline-strings-ruby-2-3-0-the-squiggly-heredoc