Le Ruby-way (TM) depuis Ruby 2.3: Utilisez le HEREDOC ondulé <<~
pour définir une chaîne multi-lignes avec des retours à la ligne et une indentation appropriée:
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
# -> "select...\nfrom...\nwhere..."
Si l'indentation appropriée n'est pas un problème, les guillemets simples et doubles peuvent s'étendre sur plusieurs lignes dans Ruby:
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"
# -> "select...\n from...\n where..."
Si les guillemets simples ou doubles sont lourds car cela nécessiterait beaucoup d'échappements, la notation littérale en pourcentage %
est la solution la plus flexible:
conn.exec %(select attr1, attr2, attr3, attr4, attr5, attr6, attr7
from table1, table2, table3, etc, etc, etc, etc, etc
where (ProductLine = 'R' OR ProductLine = "S") AND Country = "...")
# -> "select...\n from...\n where..."
Si le but est d'éviter les sauts de ligne (que provoqueront à la fois HEREDOC, les guillemets et le pourcentage de littéral de chaîne), une continuation de ligne peut être utilisée en mettant une barre oblique inverse \
comme dernier caractère non blanc dans une ligne. Cela continuera la ligne et obligera Ruby à concaténer les chaînes dos à dos (attention aux espaces à l'intérieur de la chaîne citée):
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'
# -> "select...from...where..."
Si vous utilisez Rails String.squish
, la chaîne des espaces de début et de fin sera supprimée et tous les espaces consécutifs (sauts de ligne, tabulations, etc.) seront réduits en un seul espace:
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".squish
# -> "select...attr7 from...etc, where..."
Plus de détails:
Syntaxe Ruby HEREDOC
Le travail Here Document Notation for Strings est un moyen de désigner de longs blocs de texte en ligne dans le code. Il est démarré par <<
suivi d'une chaîne définie par l'utilisateur (le terminateur de fin de chaîne). Toutes les lignes suivantes sont concaténées jusqu'à ce que le terminateur de fin de chaîne soit trouvé au tout début d'une ligne:
puts <<HEREDOC
Text Text Text Text
Bla Bla
HEREDOC
# -> "Text Text Text Text\nBlaBla"
Le terminateur de fin de chaîne peut être choisi librement, mais il est courant d'utiliser quelque chose comme "EOS" (fin de chaîne) ou quelque chose qui correspond au domaine de la chaîne tel que "SQL".
HEREDOC prend en charge l' interpolation par défaut ou lorsque le terminateur EOS est entre guillemets:
price = 10
print <<"EOS" # comments can be put here
1.) The price is #{price}.
EOS
# -> "1.) The price is 10."
L'interpolation peut être désactivée si le terminateur EOS est entre guillemets simples:
print <<'EOS' # Disabled interpolation
3.) The price is #{price}.
EOS
# -> "3.) The price is #{price}."
Une restriction importante de la <<HEREDOC
est que le terminateur de fin de chaîne doit être au début de la ligne:
puts <<EOS
def foo
print "foo"
end
EOS
EOS
#-> "....def foo\n......print "foo"\n....end\n..EOS
Pour contourner cela, la <<-
syntaxe a été créée. Il permet de mettre en retrait le terminateur EOS pour rendre le code plus agréable. Les lignes entre le <<-
terminateur et EOS sont toujours utilisées dans leur extension complète, y compris toutes les indentations:
puts <<-EOS # Use <<- to indent End of String terminator
def foo
print "foo"
end
EOS
# -> "..def foo\n....print "foo"\n..end"
Depuis Ruby 2.3, nous avons maintenant le squiggly HEREDOC <<~
supprime les espaces blancs principaux:
puts <<~EOS # Use the squiggly HEREDOC <<~ to remove leading whitespace (since Ruby 2.3!)
def foo
print "foo"
end
EOS
# -> "def foo\n..print "foo"\nend"
Les lignes vides et les lignes qui ne contiennent que des tabulations et de l'espace sont ignorées par << ~
puts <<~EOS.inspect
Hello
World!
EOS
#-> "Hello\n..World!"
Si des tabulations et des espaces sont utilisés, les tabulations sont considérées comme égales à 8 espaces. Si la ligne la moins indentée se trouve au milieu d'un onglet, cet onglet n'est pas supprimé.
puts <<~EOS.inspect
<tab>One Tab
<space><space>Two Spaces
EOS
# -> "\tOne Tab\nTwoSpaces"
HEREDOC peut faire des choses folles telles que l'exécution de commandes à l'aide de backticks:
puts <<`EOC`
echo #{price}
echo #{price * 2}
EOC
Les définitions de chaîne HEREDOC peuvent être "empilées", ce qui signifie que le premier terminateur EOS (EOSFOO ci-dessous) terminera la première chaîne et démarrera la seconde (EOSBAR ci-dessous):
print <<EOSFOO, <<EOSBAR # you can stack them
I said foo.
EOSFOO
I said bar.
EOSBAR
Je ne pense pas que quiconque l'utiliserait jamais en tant que tel, mais <<EOS
c'est vraiment juste un littéral de chaîne et peut être mis là où une chaîne peut normalement être mise:
def func(a,b,c)
puts a
puts b
puts c
end
func(<<THIS, 23, <<THAT)
Here's a line
or two.
THIS
and here's another.
THAT
Si vous n'avez pas Ruby 2.3, mais Rails >=
3.0, vous pouvez utiliser String.strip_heredoc
ce qui fait la même chose que<<~
# File activesupport/lib/active_support/core_ext/string/strip.rb, line 22
class String
def strip_heredoc
gsub(/^#{scan(/^[ \t]*(?=\S)/).min}/, "".freeze)
end
end
puts <<-USAGE.strip_heredoc # If no Ruby 2.3, but Rails >= 3.0
This command does such and such.
Supported options are:
-h This message
...
USAGE
Pourcentages de chaînes de caractères
Voir RubyDoc pour savoir comment utiliser le signe de pourcentage suivi d'une chaîne dans une paire de parenthèses comme un %(...)
, %[...]
,%{...}
, etc. ou une paire de tout caractère non alphanumérique tel%+...+
Derniers mots
Enfin, pour obtenir la réponse à la question initiale "Existe-t-il un moyen d'impliquer la concaténation?" répondu: Ruby implique toujours la concaténation si deux chaînes (simples et doubles entre guillemets) se trouvent dos à dos:
puts "select..." 'from table...' "where..."
# -> "select...from table...where..."
La mise en garde est que cela ne fonctionne pas entre les sauts de ligne, car Ruby interprète une fin de déclaration et la ligne conséquente de chaînes uniquement sur une ligne ne fait rien.