J'ai un problème avec un heredoc Ruby que j'essaye de faire. Il renvoie le premier espace blanc de chaque ligne même si j'inclus l'opérateur -, qui est censé supprimer tous les caractères blancs de tête. ma méthode ressemble à ceci:
def distinct_count
<<-EOF
\tSELECT
\t CAST('#{name}' AS VARCHAR(30)) as COLUMN_NAME
\t,COUNT(DISTINCT #{name}) AS DISTINCT_COUNT
\tFROM #{table.call}
EOF
end
et ma sortie ressemble à ceci:
=> " \tSELECT\n \t CAST('SRC_ACCT_NUM' AS VARCHAR(30)) as
COLUMN_NAME\n \t,COUNT(DISTINCT SRC_ACCT_NUM) AS DISTINCT_COUNT\n
\tFROM UD461.MGMT_REPORT_HNB\n"
ceci, bien sûr, est juste dans ce cas précis, sauf pour tous les espaces entre le premier "et \ t. Est-ce que quelqu'un sait ce que je fais de mal ici?
la source
Si vous utilisez Rails 3.0 ou plus récent, essayez
#strip_heredoc
. Cet exemple de la documentation imprime les trois premières lignes sans indentation, tout en conservant l'indentation à deux espaces des deux dernières lignes:La documentation note également: "Techniquement, il recherche la ligne la moins indentée dans toute la chaîne et supprime cette quantité d'espaces blancs de début."
Voici l'implémentation de active_support / core_ext / string / strip.rb :
Et vous pouvez trouver les tests dans test / core_ext / string_ext_test.rb .
la source
require "active_support/core_ext/string"
abordtry
n'est pas défini pour String. En fait, il semble que ce soit une construction spécifique aux railsPas grand chose à faire que je sache, j'en ai peur. Je fais habituellement:
Cela fonctionne mais c'est un peu un hack.
EDIT: En m'inspirant de René Saarsoo ci-dessous, je suggérerais plutôt quelque chose comme ceci:
Cette version devrait gérer lorsque la première ligne n'est pas celle la plus à gauche.
la source
EOF
lui-même, plutôt que simplementString
?\s
inclut les nouvelles lignes.Voici une version beaucoup plus simple du script unindent que j'utilise:
Utilisez-le comme ceci:
Si la première ligne peut être plus indentée que les autres et que vous souhaitez (comme Rails) se désindenter en fonction de la ligne la moins indentée, vous pouvez à la place utiliser:
Notez que si vous recherchez au
\s+
lieu de[ \t]+
vous, vous risquez de supprimer les nouvelles lignes de votre heredoc au lieu des espaces de début. Pas souhaitable!la source
<<-
dans Ruby ignorera uniquement l'espace de début pour le délimiteur de fin, lui permettant d'être correctement indenté. Il ne supprime pas l'espace de début sur les lignes à l'intérieur de la chaîne, malgré ce que certains documents en ligne pourraient dire.Vous pouvez supprimer vous-même les espaces de début en utilisant
gsub
:Ou si vous souhaitez simplement supprimer des espaces, en laissant les onglets:
la source
D'autres réponses trouver le niveau de retrait de la moindre ligne dentelée et supprimer que de toutes les lignes, mais compte tenu de la nature de l' empreinte dans la programmation (que la première ligne est le moins en retrait), je pense que vous devriez chercher le niveau de retrait de la première ligne .
la source
Comme l'affiche originale, j'ai moi aussi découvert la
<<-HEREDOC
syntaxe et j'ai été très déçue qu'elle ne se soit pas comportée comme je le pensais.Mais au lieu de joncher mon code avec gsub-s, j'ai étendu la classe String:
la source
Remarque: comme @radiospiel l'a souligné,
String#squish
n'est disponible que dans leActiveSupport
contexte.Je crois
rubyString#squish
est plus proche de ce que vous recherchez vraiment:Voici comment je traiterais votre exemple:
la source
une autre option facile à retenir est d'utiliser une gemme non indexée
la source
J'avais besoin d'utiliser quelque chose avec
system
lequel je pourrais diviser de longuessed
commandes sur des lignes, puis supprimer l'indentation ET les nouvelles lignes ...Alors je suis venu avec ceci:
Le comportement par défaut est de ne pas supprimer les retours à la ligne, comme tous les autres exemples.
la source
Je recueille des réponses et j'ai ceci:
Il génère un excellent SQL et ne sort pas des portées AR.
la source