493 votes

Ruby: je Peux écrire multi-ligne de chaîne sans concaténation?

Est-il un moyen de le rendre un peu mieux?

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'

Comme, il est un moyen pour impliquer la concaténation?

693voto

A. Wilson Points 1584

Il y a des morceaux pour cette réponse qui m'a aidé à obtenir ce dont j'avais besoin (facile multi-ligne concaténation SANS les espaces), mais depuis aucune des réponses, je suis la compilation ici:

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"

En bonus, voici une version à l'aide de drôles de syntaxe HEREDOC (via ce lien):

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

Ce dernier serait principalement pour les situations nécessitant plus de souplesse dans le traitement. Personnellement, je ne l'aime pas, il met le traitement dans un étrange endroit w.r.t. la chaîne (c'est à dire, en face de lui, mais en utilisant des méthodes d'instance qui viennent généralement par la suite), mais il est là.

Ce n'est pas de sauver beaucoup de frappe, mais il semble plus agréable que d'utiliser les signes+, pour moi.

EDIT: Ajout d'un:

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

223voto

Robbie Guilfoyle Points 569

En ruby 2.0 maintenant vous pouvez simplement utiliser %

Par exemple:

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

180voto

Mark Byers Points 318575

Oui, si vous n'avez pas l'esprit de la supplémentaire des sauts de ligne insérés:

 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'

Alternativement, vous pouvez utiliser un 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

50voto

Hongli Points 8862

Il existe plusieurs syntaxes pour le multi-ligne de chaînes que vous avez déjà lus. Mon préféré est Perl-style:

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}

Le multi-ligne de chaîne de caractères commence par q%, suivie par un {, [ ou (et puis résilié par le correspondant inversée de caractère. q %ne permet pas de l'interpolation, %Q, donc vous pouvez écrire des choses comme ceci:

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}

En fait, j'ai aucune idée de la façon dont ces types de multi-ligne, les chaînes de caractères sont appelés donc, nous allons simplement appeler Perl multilines.

Notez cependant que si vous utilisez Perl multilines ou heredocs que Mark et Peter ont suggéré, vous vous retrouverez avec potentiellement inutiles espaces. À la fois dans mes exemples et leurs exemples, le "de" et "où" les lignes contiennent des espaces en raison de leur mise en retrait dans le code. Si cet espace n'est pas souhaitée, puis vous devez utiliser les chaînes concaténées comme vous le faites maintenant.

31voto

squixy Points 1146

Parfois, vaut la peine d'enlever les caractères de nouvelle ligne \n comme:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X