Tengo un problema con un heredoc de Ruby que estoy intentando hacer. Devuelve el espacio en blanco inicial de cada línea a pesar de que incluyo el operador -, que se supone que suprime todos los espacios en blanco iniciales. mi método se ve así:
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
y mi salida se ve así:
=> " \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"
esto, por supuesto, es correcto en este caso específico, excepto por todos los espacios entre el primer "y \ t. ¿Alguien sabe lo que estoy haciendo mal aquí?
fuente
Si está utilizando Rails 3.0 o más reciente, inténtelo
#strip_heredoc
. Este ejemplo de los documentos imprime las primeras tres líneas sin sangría, mientras que conserva la sangría de dos espacios de las dos últimas líneas:La documentación también señala: "Técnicamente, busca la línea con menos sangría en toda la cadena y elimina esa cantidad de espacios en blanco iniciales".
Aquí está la implementación de active_support / core_ext / string / strip.rb :
Y puede encontrar las pruebas en test / core_ext / string_ext_test.rb .
fuente
require "active_support/core_ext/string"
primerotry
no está definido para String. De hecho, parece que es una construcción específica de rielesNo hay mucho que hacer que yo sepa, me temo. Yo suelo hacer:
Eso funciona, pero es un truco.
EDITAR: Inspirándome en Rene Saarsoo a continuación, sugeriría algo como esto en su lugar:
Esta versión debería funcionar cuando la primera línea no es la más a la izquierda.
fuente
EOF
sí mismo, en lugar de simplementeString
?\s
Consejo profesional: pruebe cualquiera de estos con líneas en blanco en el contenido y luego recuerde que incluye nuevas líneas.Aquí hay una versión mucho más simple del script sin sangría que uso:
Úselo así:
Si la primera línea puede tener más sangría que otras y desea (como Rails) eliminar la sangría en función de la línea con menos sangría, puede que desee utilizar:
Tenga en cuenta que si busca en
\s+
lugar de[ \t]+
, puede terminar eliminando nuevas líneas de su heredoc en lugar de espacios en blanco iniciales. ¡No deseable!fuente
<<-
en Ruby solo ignorará el espacio inicial para el delimitador final, lo que permitirá que tenga una sangría adecuada. No elimina el espacio inicial en las líneas dentro de la cadena, a pesar de lo que pueda decir alguna documentación en línea.Puede eliminar los espacios en blanco iniciales usted mismo utilizando
gsub
:O si solo desea eliminar espacios, dejando las pestañas:
fuente
Algunas otras respuestas encontrar el nivel de sangría de la línea menos sangría , y eliminar que a partir de todas las líneas, pero teniendo en cuenta la naturaleza de la muesca en la programación (que la primera línea es el menos sangría), creo que se debe buscar el nivel de sangría de la primera línea .
fuente
Al igual que el póster original, yo también descubrí la
<<-HEREDOC
sintaxis y me decepcionó mucho que no se comportara como yo pensaba que debería comportarse.Pero en lugar de ensuciar mi código con gsub-s, extendí la clase String:
fuente
Nota: Como señaló @radiospiel,
String#squish
solo está disponible en elActiveSupport
contexto.Yo creo
rubyString#squish
está más cerca de lo que realmente estás buscando:Así es como manejaría su ejemplo:
fuente
otra opción fácil de recordar es usar gema sin sangría
fuente
Necesitaba usar algo con
system
lo que pudiera dividirsed
comandos largos en líneas y luego eliminar la sangría Y las nuevas líneas ...Entonces se me ocurrió esto:
El comportamiento predeterminado es no eliminar las nuevas líneas, como todos los demás ejemplos.
fuente
Recopilo respuestas y obtuve esto:
Genera un excelente SQL y no se sale de los alcances de AR.
fuente