web-dev-qa-db-fra.com

Ruby: Puis-je écrire une chaîne multiligne sans concaténation?

Y a-t-il un moyen d'améliorer cet aspect?

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, y a-t-il un moyen d'impliquer la concaténation?

366
Zombies

Il y a des éléments de cette réponse qui m'ont aidé à obtenir ce dont j'avais besoin (concaténation simple sur plusieurs lignes SANS espace supplémentaire), mais comme aucune des réponses actuelles ne l'avait, je les compile 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 utilisant la syntaxe amusante 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 des situations qui nécessitaient plus de flexibilité dans le traitement. Personnellement, je n'aime pas ça, cela met le traitement dans un endroit étrange où w.r.t. la chaîne (c'est-à-dire devant, mais en utilisant des méthodes d'instance qui viennent généralement après), mais c'est là. Notez que si vous indentez le dernier identifiant END_SQL (qui est commun, puisqu'il se trouve probablement dans une fonction ou un module), vous devrez utiliser la syntaxe composée d'un trait d'union (c'est-à-dire p <<-END_SQL au lieu de p <<END_SQL). Sinon, les espaces blancs indentés font que l'identifiant est interprété comme une continuation de la chaîne.

Cela ne fait pas économiser beaucoup de frappe, mais cela me semble plus agréable que d'utiliser des signes +.

EDIT: Ajouter un de plus:

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

Oui, si les nouvelles lignes supplémentaires insérées ne vous dérangent pas:

 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'

Sinon, 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
164
Mark Byers

Dans Ruby 2.0, vous pouvez maintenant simplement utiliser %

Par exemple:

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

Il existe plusieurs syntaxes pour les chaînes multilignes que vous avez déjà lues. Mon préféré est le style 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}

La chaîne multiligne commence par% q, suivie par un {, [ou (, puis se termine par le caractère inversé correspondant.% Q ne permet pas l'interpolation;% Q le permet, 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, je ne sais pas du tout comment s'appellent ces types de chaînes multilignes, appelons-les simplement des multilignes Perl.

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

51
Hongli

Il est parfois utile de supprimer les nouveaux caractères de 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
29
Kamil Lelonek

Vous pouvez également utiliser des guillemets doubles

x = """
this is 
a multiline
string
"""

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

Si nécessaire pour supprimer les sauts de ligne "\ n", utilisez une barre oblique inverse "\" à la fin de chaque ligne.

20
juliangonzalez
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
16
Peter

Autres options:

#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
12
Alex Cohen

Récemment, avec les nouvelles fonctionnalités de Ruby 2.3, le nouveau squiggly HEREDOC vous permettra d'écrire nos chaînes multilignes de manière agréable, avec un changement minime, si bien que si vous le combinez avec le .squish écrivez multiligne de façon sympa!

[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

11
Mark Jad
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'

<< est l'opérateur de concaténation pour les chaînes

7
Dom Brezinski

Si vous faites pensez à des espaces supplémentaires et des nouvelles lignes, vous pouvez utiliser

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} * ' '

(utilisez% W pour les chaînes interpolées)

5
UncleGene
conn.exec [
  "select attr1, attr2, attr3, ...",
  "from table1, table2, table3, ...",
  "where ..."
].join(' ')

Cette suggestion présente l'avantage par rapport aux documents et aux longues chaînes que les auto-indenteurs peuvent indenter chaque partie de la chaîne de manière appropriée. Mais cela a un coût d'efficacité.

3
Aidan Cully

Pour éviter de fermer les parenthèses pour chaque ligne, vous pouvez simplement utiliser des guillemets doubles avec une barre oblique inverse pour échapper à la nouvelle ligne:

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