Estou tendo um problema com um heredoc Ruby que estou tentando fazer. Ele está retornando o espaço em branco inicial de cada linha, embora eu esteja incluindo o operador -, que supostamente suprime todos os caracteres de espaço em branco iniciais. meu método se parece com este:
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
e minha saída fica assim:
=> " \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"
isso, é claro, está certo neste caso específico, exceto por todos os espaços entre o primeiro "e \ t. alguém sabe o que estou fazendo de errado aqui?
fonte
Se você estiver usando Rails 3.0 ou mais recente, tente
#strip_heredoc
. Este exemplo da documentação imprime as três primeiras linhas sem recuo, enquanto mantém o recuo de dois espaços das duas últimas linhas:A documentação também observa: "Tecnicamente, ele procura a linha menos recuada em toda a string e remove a quantidade de espaços em branco à esquerda."
Aqui está a implementação de active_support / core_ext / string / strip.rb :
E você pode encontrar os testes em test / core_ext / string_ext_test.rb .
fonte
require "active_support/core_ext/string"
primeirotry
não está definido para String. Na verdade, parece que é uma construção específica para trilhosNão tenho muito a fazer que eu tenha medo. Eu costumo fazer:
Isso funciona, mas é um pouco hack.
EDIT: Inspirando-se em Rene Saarsoo abaixo, sugiro algo assim:
Esta versão deve ser tratada quando a primeira linha não está mais à esquerda também.
fonte
EOF
si, em vez de apenasString
?\s
inclui novas linhas.Esta é uma versão muito mais simples do script sem recuo que uso:
Use-o assim:
Se a primeira linha pode ser indentada mais do que outras, e deseja (como Rails) desfazer o indentação com base na linha menos indentada, você pode querer usar:
Observe que se você digitalizar em
\s+
vez de,[ \t]+
poderá acabar removendo novas linhas de seu heredoc em vez de espaços em branco à esquerda. Não é desejável!fonte
<<-
em Ruby irá apenas ignorar o espaço inicial para o delimitador de finalização, permitindo que ele seja devidamente indentado. Ele não remove o espaço inicial nas linhas dentro da string, apesar do que alguns documentos online podem dizer.Você mesmo pode remover o espaço em branco inicial usando
gsub
:Ou se você quiser apenas eliminar os espaços, deixando as guias:
fonte
Algumas outras respostas encontrar o nível de recuo da linha menos recuada e excluir que a partir de todas as linhas, mas considerando a natureza de recuo na programação (que a primeira linha é o menos recuado), eu acho que você deve olhar para o nível de recuo do primeira linha .
fonte
Como o pôster original, eu também descobri a
<<-HEREDOC
sintaxe e fiquei muito desapontado por ela não se comportar como pensei que deveria se comportar.Mas em vez de encher meu código com gsub-s, eu estendi a classe String:
fonte
Nota: como @radiospiel apontou,
String#squish
está disponível apenas noActiveSupport
contexto.Acredito
rubyString#squish
está mais perto do que você realmente procura:Aqui está como eu lidaria com seu exemplo:
fonte
outra opção fácil de lembrar é usar unindent gem
fonte
Eu precisava usar algo com o
system
qual eu pudesse dividirsed
comandos longos entre linhas e, em seguida, remover recuo E novas linhas ...Então eu vim com isso:
O comportamento padrão é não remover novas linhas, assim como todos os outros exemplos.
fonte
Eu coleciono respostas e tenho isto:
Gera SQL excelente e não sai dos escopos de AR.
fonte