Existe-t-il un moyen de rendre cela un peu meilleur?
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'
Par exemple, existe-t-il un moyen d'impliquer la concaténation?
ruby
code-formatting
Des morts-vivants
la source
la source
Réponses:
Il y a des éléments dans cette réponse qui m'ont aidé à obtenir ce dont j'avais besoin (concaténation multi-lignes facile SANS espace supplémentaire), mais comme aucune des réponses réelles ne l'avait, je les compile ici:
En bonus, voici une version utilisant une drôle de syntaxe HEREDOC (via ce lien ):
Ces derniers concerneraient principalement des situations nécessitant plus de flexibilité dans le traitement. Personnellement, je ne l'aime pas, cela place le traitement dans un endroit étrange par rapport à la chaîne (c'est-à-dire devant, mais en utilisant des méthodes d'instance qui viennent généralement après), mais il est là. Notez que si vous indentez le dernier
END_SQL
identifiant (ce qui est courant, car il s'agit probablement d'une fonction ou d'un module), vous devrez utiliser la syntaxe avec trait d'union (c'est-à-direp <<-END_SQL
au lieu dep <<END_SQL
). Sinon, le blanc en retrait induit l'interpréteur comme une continuation de la chaîne.Cela n'économise pas beaucoup de frappe, mais cela me semble plus agréable que d'utiliser des signes +.
De plus (je dis dans une édition, plusieurs années plus tard), si vous utilisez Ruby 2.3+, l'opérateur << ~ est également disponible , ce qui supprime l'indentation supplémentaire de la chaîne finale. Vous devriez pouvoir supprimer l'
.gsub
invocation, dans ce cas (bien que cela puisse dépendre à la fois de l'indentation de départ et de vos besoins finaux).EDIT: Ajout d'un plus:
la source
p <<END_SQL
devrait êtrep <<-END_SQL
Sinon, c'est la réponse. en option, vous pouvez supprimer les espaces blancs de premier plan avec l'opérateur squiggly HEREDOC,<<~END_SQL
<<~
à la réponse serait bien, a fini par faire des recherches à partir de là. Personnellement, j'utilise<<~MSG.strip ... MSG
ce qui enlève aussi le dernier\n
.Dans ruby 2.0, vous pouvez maintenant simplement utiliser
%
Par exemple:
la source
squish
sur la sortie devrait être utile.Oui, si cela ne vous dérange pas l'insertion de nouvelles lignes supplémentaires:
Vous pouvez également utiliser un hérédoc :
la source
%Q(...)
%(...)
Il existe plusieurs syntaxes pour les chaînes multilignes comme vous l'avez déjà lu. Mon préféré est le style Perl:
La chaîne multiligne commence par% q, suivie d'un {, [ou (, puis se termine par le caractère inversé correspondant.% Q ne permet pas l'interpolation;% Q le fait, vous pouvez donc écrire des choses comme ceci:
En fait, je n'ai aucune idée de la façon dont ces types de chaînes multi-lignes sont appelés alors appelons-les simplement 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 blancs potentiellement inutiles. Dans mes exemples et leurs exemples, les lignes "from" et "where" contiennent des espaces blancs de début en raison de leur retrait dans le code. Si cet espace n'est pas souhaité, vous devez utiliser des chaînes concaténées comme vous le faites maintenant.
la source
%q
famille incluront les sauts de ligne qui ne sont pas équivalents au code d'origine.Il vaut parfois la peine de supprimer de nouveaux caractères de ligne
\n
comme:la source
Vous pouvez également utiliser des guillemets doubles
Si nécessaire pour supprimer les sauts de ligne "\ n" utilisez une barre oblique inverse "\" à la fin de chaque ligne
la source
"" + "double quotes with some content" + ""
."x"
air mieux et fonctionne plus rapidement que"""x"""
(ce qui est fondamentalement le même que""+"x"+""
) ou"""""x"""""
(ce qui est le même que"" + "" + "x" + "" + ""
). C'est Ruby, pas Python, où vous utilisez"""
plutôt que"
lorsque vous avez besoin d'une chaîne multi-lignes.la source
Autres options:
la source
<<EOM
pour<<-EOM
, non?<<-EOF
exemple. Je suppose que dans les deux cas, cela fonctionne.Récemment, avec les nouvelles fonctionnalités de Ruby 2.3, la nouvelle
squiggly HEREDOC
vous permettra d'écrire nos chaînes multilignes de manière agréable avec un changement minimal, donc l'utilisation de cela combiné avec le.squish
(si vous utilisez des rails) vous permettra d'écrire multiligne de manière agréable! en cas de simple utilisation de rubis, vous pouvez faire un<<~SQL.split.join(" ")
qui est presque le mêmeréf: https://infinum.co/the-capsized-eight/multiline-strings-ruby-2-3-0-the-squiggly-heredoc
la source
<< est l'opérateur de concaténation des chaînes
la source
+
est l'opérateur de concaténation régulier,<<
est l' opérateur d'ajout sur place . L'utilisation d'effets secondaires sur un littéral fonctionne ici (la première chaîne est modifiée deux fois et renvoyée) mais à mon humble avis, c'est bizarre et me fait faire une double prise, où ce+
serait parfaitement clair. Mais peut-être que je suis juste nouveau pour Ruby ...frozen_string_literal
est activéSi vous faites l' esprit des espaces supplémentaires et des sauts de ligne, vous pouvez utiliser
(utilisez% W pour les chaînes interpolées)
la source
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:
la source
Cette suggestion a l'avantage sur les documents et les chaînes longues ici que les auto-indenters peuvent indenter chaque partie de la chaîne de manière appropriée. Mais cela a un coût d'efficacité.
la source
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:Si l'indentation appropriée n'est pas un problème, les guillemets simples et doubles peuvent s'étendre sur plusieurs lignes dans Ruby:
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: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):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: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: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:
L'interpolation peut être désactivée si le terminateur EOS est entre guillemets simples:
Une restriction importante de la
<<HEREDOC
est que le terminateur de fin de chaîne doit être au début de la ligne: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:Depuis Ruby 2.3, nous avons maintenant le squiggly HEREDOC
<<~
supprime les espaces blancs principaux:Les lignes vides et les lignes qui ne contiennent que des tabulations et de l'espace sont ignorées par << ~
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é.
HEREDOC peut faire des choses folles telles que l'exécution de commandes à l'aide de backticks:
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):
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:Si vous n'avez pas Ruby 2.3, mais Rails
>=
3.0, vous pouvez utiliserString.strip_heredoc
ce qui fait la même chose que<<~
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:
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.
la source
Réponse élégante aujourd'hui:
Il y a une différence dans
<<-TEXT
et<<~TEXT
, l'ancien conserve l'espacement à l'intérieur du bloc et ce dernier ne le fait pas.Il existe également d'autres options. Comme la concaténation, etc., mais celle-ci a plus de sens en général.
Si je me trompe ici, faites-moi savoir comment ...
la source
Comme vous, je cherchais également une solution qui n'inclut pas les retours à la ligne . (Bien qu'ils puissent être sûrs en SQL, ils ne le sont pas dans mon cas et j'ai un gros bloc de texte à traiter)
C'est sans doute tout aussi laid, mais vous pouvez annuler les sauts de ligne dans un hérédoc pour les omettre de la chaîne résultante:
Notez que vous ne pouvez pas le faire sans interpolation (IE
<<~'END_OF_INPUT'
), alors soyez prudent.#{expressions}
seront évalués ici, alors qu'ils ne le seront pas dans votre code d'origine. La réponse de A. Wilson peut être meilleure pour cette raison.la source