Comment puis-je supprimer les espaces caractères à partir de Ruby HEREDOC?
Je vais avoir un problème avec un Rubis heredoc je suis en train de faire. Elle retourne le premier espace de chaque ligne, même si je suis, y compris l'opérateur, qui est censé supprimer tous les principaux caractères espace. 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"
cela, bien sûr, est de droit dans ce cas précis, à l'exception de tous les espaces entre le premier " et "\t". personne ne sait ce que je fais de mal?
Vous devez vous connecter pour publier un commentaire.
La
<<-
forme de heredoc seulement ignore les principaux espaces de la fin délimiteur.Avec Ruby 2.3 et versions ultérieures, vous pouvez utiliser un enchevêtrées heredoc (
<<~
) pour supprimer les principaux espaces de lignes du contenu:De l'Ruby les littéraux de la documentation:
Si vous êtes à l'aide de Rails 3.0 ou plus récent, essayez
#strip_heredoc
. Cet exemple de la docs imprime les trois premières lignes sans indentation, tout en conservant les deux dernières lignes de " deux-espace indentation:La documentation indique également: "Techniquement, il semble pour le moins en retrait de la ligne dans l'ensemble de la chaîne, et supprime le montant de diriger les espaces."
Voici la mise en œuvre de active_support/core_ext/string/dép.rb:
Et vous pouvez trouver les tests de test/core_ext/string_ext_test.rb.
require "active_support/core_ext/string"
premièretry
n'est pas définie pour la Chaîne. En fait, il semble que c'est un des rails spécifiques à construirePas grand chose à faire, que je sache, j'en ai peur. J'ai l'habitude de faire:
Qui fonctionne mais est un peu un hack.
EDIT:
Tirant son inspiration de René Saarsoo ci-dessous, je vous suggère quelque chose comme ceci à la place:
Cette version doit gérer lors de la première ligne n'est pas celui le plus à gauche.
EOF
lui-même, plutôt que de simplementString
?\s
comprend des retours à la ligne.Ici est beaucoup plus simple de la version de la unindent script que j'utilise:
L'utiliser comme ceci:
Si la première ligne peut être en retrait de plus que les autres, et que vous voulez (comme des Rails) pour unindent le moins en retrait de la ligne, vous pouvez vous souhaitez utiliser:
Notez que si vous numérisez des
\s+
au lieu de[ \t]+
vous pouvez vous retrouver décapage des retours à la ligne à partir de votre heredoc au lieu de mener des espaces. Pas souhaitable!<<-
en Ruby ignore espace pour le délimiteur final, lui permettant d'être correctement indenté. Il n'a pas de bande de l'espace sur les lignes à l'intérieur de la chaîne, en dépit de ce que certains de la documentation en ligne pourrait-on dire.Vous pouvez strip principal whitespace vous-même en utilisant
gsub
:Ou si vous voulez juste pour la bande des espaces, de laisser les onglets:
Certains autres réponses à trouver le niveau de retrait de le moins en retrait de la ligne de, et supprimer à partir de toutes les lignes, mais compte tenu de la nature de l'indentation dans la programmation (que la première ligne est le moins en retrait), je pense que vous devriez regarder pour le niveau de retrait de la première ligne.
Comme le posteur d'origine, j'ai aussi découvert le
<<-HEREDOC
syntaxe et a été sacrément déçu qu'elle ne se comportent pas comme je le pensais, il doit se comporter.Mais au lieu de salir mon code avec gsub-s, j'ai étendu la classe String:
Remarque: Comme @radiospiel souligné,
String#squish
est uniquement disponible dans laActiveSupport
contexte.Je crois
rubyString#squish
est plus proche de ce que vous êtes vraiment à la recherche pour:Ici est de savoir comment je réagirais, votre exemple:
un autre facile à retenir l'option est d'utiliser unindent gem
J'avais besoin d'utiliser quelque chose avec
system
lequel je pourrait diviser longsed
commandes sur plusieurs lignes, puis supprimer l'indentation ET les retours à la ligne...Alors je suis venu avec cette:
Comportement par défaut est de ne pas dépouiller les retours à la ligne, tout comme tous les autres exemples.
Je récupérer les réponses et obtenu ceci:
Il génère d'excellentes SQL et ne pas sortir de l'AR étendues.