¿Hay alguna manera de hacer que esto se vea un poco mejor?
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'
Como, ¿hay alguna manera de implicar concatenación?
ruby
code-formatting
Zombis
fuente
fuente
Respuestas:
Hay partes de esta respuesta que me ayudaron a obtener lo que necesitaba (concatenación fácil de varias líneas SIN espacios en blanco adicionales), pero como ninguna de las respuestas reales lo tenía, las estoy compilando aquí:
Como beneficio adicional, aquí hay una versión que usa la sintaxis divertida de HEREDOC (a través de este enlace ):
Este último sería principalmente para situaciones que requieren más flexibilidad en el procesamiento. Personalmente no me gusta, coloca el procesamiento en un lugar extraño con la cadena (es decir, delante de él, pero usando métodos de instancia que generalmente vienen después), pero está ahí. Tenga en cuenta que si está sangrando el último
END_SQL
identificador (lo cual es común, ya que probablemente esté dentro de una función o módulo), deberá usar la sintaxis con guiones (es decir, enp <<-END_SQL
lugar dep <<END_SQL
). De lo contrario, el espacio en blanco de sangría hace que el identificador se interprete como una continuación de la cadena.Esto no ahorra mucho tipeo, pero para mí se ve mejor que usar signos +.
Además (lo digo en una edición, varios años después), si está utilizando Ruby 2.3+, el operador << ~ también está disponible , lo que elimina la sangría adicional de la cadena final. Debería poder eliminar la
.gsub
invocación, en ese caso (aunque puede depender tanto de la sangría inicial como de sus necesidades finales).EDITAR: Agregar uno más:
fuente
p <<END_SQL
debe serp <<-END_SQL
lo demás, es la respuesta. opcionalmente puede eliminar espacios en blanco con el operador HEREDOC ondulado,<<~END_SQL
<<~
a la respuesta sería bueno, terminé investigando eso desde allí. Personalmente, uso el<<~MSG.strip ... MSG
que también elimina el último\n
.En ruby 2.0 ahora puedes usar
%
Por ejemplo:
fuente
squish
en la salida debería ser útil.Sí, si no le importa que se inserten nuevas líneas adicionales:
Alternativamente, puede usar un heredoc :
fuente
%Q(...)
%(...)
Hay varias sintaxis para cadenas de varias líneas, como ya ha leído. Mi favorito es el estilo Perl:
La cadena de varias líneas comienza con% q, seguida de un {, [o (, y luego termina con el carácter inverso correspondiente.% Q no permite la interpolación;% Q lo hace para que pueda escribir cosas como esta:
De hecho, no tengo idea de cómo se llaman este tipo de cadenas de varias líneas, así que llamémoslas Perl multilíneas.
Sin embargo, tenga en cuenta que si usa líneas múltiples Perl o heredocs como Mark y Peter han sugerido, terminará con espacios en blanco potencialmente innecesarios. Tanto en mis ejemplos como en sus ejemplos, las líneas "desde" y "dónde" contienen espacios en blanco iniciales debido a su sangría en el código. Si no se desea este espacio en blanco, debe usar cadenas concatenadas como lo está haciendo ahora.
fuente
%q
familia incluirán las nuevas líneas que no son equivalentes al código original.A veces vale la pena eliminar nuevos caracteres de línea
\n
como:fuente
También puedes usar comillas dobles
Si es necesario para eliminar saltos de línea "\ n", utilice la barra invertida "\" al final de cada línea
fuente
"" + "double quotes with some content" + ""
."x"
ve mejor y funciona más rápido que"""x"""
(que es básicamente lo mismo que""+"x"+""
) o"""""x"""""
(que es lo mismo que"" + "" + "x" + "" + ""
). Es Ruby, no Python, donde se usa en"""
lugar de"
cuando se necesita una cadena de varias líneas.fuente
Otras opciones:
fuente
<<EOM
a<<-EOM
, ¿no?<<-EOF
ejemplo. Mi suposición es que de cualquier manera funciona.Recientemente, con las nuevas características en Ruby 2.3, la nueva
squiggly HEREDOC
le permitirá escribir nuestras cadenas multilínea de una manera agradable con un cambio mínimo, por lo que usar esto combinado con.squish
(si está usando rieles) le permitirá escribir multilínea de una manera agradable. en caso de usar solo ruby, puedes hacer uno<<~SQL.split.join(" ")
que sea casi igualref: https://infinum.co/the-capsized-eight/multiline-strings-ruby-2-3-0-the-squiggly-heredoc
fuente
<< es el operador de concatenación para cadenas
fuente
+
es el operador de concatenación regular,<<
es el operador de adición in situ . El uso de efectos secundarios en un literal funciona aquí (la primera cadena se modifica dos veces y se devuelve), en mi humilde opinión, es extraño y me hace hacer una doble toma, donde+
estaría perfectamente claro. Pero tal vez soy nuevo en Ruby ...frozen_string_literal
está habilitadoSi haces espacios y nuevas líneas adicionales mente, puede utilizar
(use% W para cadenas interpoladas)
fuente
Para evitar cerrar los paréntesis para cada línea, simplemente puede usar comillas dobles con una barra invertida para escapar de la nueva línea:
fuente
Esta sugerencia tiene la ventaja sobre los documentos aquí y las cadenas largas que los auto-indentadores pueden sangrar cada parte de la cadena de manera apropiada. Pero tiene un costo de eficiencia.
fuente
Ruby-way (TM) desde Ruby 2.3: use el HEREDOC ondulado
<<~
para definir una cadena de varias líneas con líneas nuevas y sangría adecuada:Si la sangría adecuada no es una preocupación, las comillas simples y dobles pueden abarcar varias líneas en Ruby:
Si las comillas simples o dobles son engorrosas porque eso requeriría mucho escape, entonces la notación literal de cadena de porcentaje
%
es la solución más flexible:Si el objetivo es evitar las nuevas líneas (que causan tanto el HEREDOC ondulado, las comillas como el literal de cadena de porcentaje), entonces se puede usar una continuación de línea colocando una barra diagonal inversa
\
como el último carácter no en blanco en una línea. Esto continuará la línea y hará que Ruby concatene las cadenas de forma consecutiva (tenga cuidado con esos espacios dentro de la cadena citada):Si usa Rails
String.squish
, eliminará la cadena de espacios iniciales y finales y colapsará todos los espacios en blanco consecutivos (líneas nuevas, pestañas y todo) en un solo espacio:Más detalles:
Sintaxis de Ruby HEREDOC
La notación de documento aquí para cadenas funciona es una forma de designar bloques largos de texto en línea en el código. Se inicia
<<
seguido de una Cadena definida por el usuario (el finalizador de Fin de Cadena). Todas las siguientes líneas se concatenan hasta que se encuentra el finalizador de Fin de cadena al comienzo de una línea:El terminador End of String se puede elegir libremente, pero es común usar algo como "EOS" (End of String) o algo que coincida con el dominio de la cadena como "SQL".
HEREDOC admite la interpolación de manera predeterminada o cuando el terminador EOS se cita dos veces:
La interpolación se puede deshabilitar si el terminador EOS se cita solo:
Una restricción importante de la
<<HEREDOC
es que el terminador de Fin de cadena debe estar al principio de la línea:Para evitar esto,
<<-
se creó la sintaxis. Permite sangrar el terminador EOS para que el código se vea mejor. Las líneas entre el<<-
terminador y el EOS todavía se usan en toda su extensión, incluida toda sangría:Desde Ruby 2.3, ahora tenemos el HEREDOC ondulado que
<<~
elimina los espacios en blanco iniciales :<< ~ ignora las líneas vacías y las líneas que solo contienen pestañas y espacios.
Si se usan tabulaciones y espacios, las pestañas se consideran iguales a 8 espacios. Si la línea con menos sangría está en el medio de una pestaña, esta pestaña no se elimina.
HEREDOC puede hacer algunas locuras, como ejecutar comandos usando backticks:
Las definiciones de cadenas HEREDOC se pueden "apilar", lo que significa que el primer terminador EOS (EOSFOO a continuación) finalizará la primera cadena e iniciará la segunda (EOSBAR a continuación):
No creo que nadie lo use como tal, pero en
<<EOS
realidad es solo una cadena literal y se puede poner donde sea que se pueda poner una cadena:Si no tiene Ruby 2.3, pero Rails
>=
3.0, puede usar elString.strip_heredoc
que hace lo mismo que<<~
Porcentaje de cadenas literales
Ver RubyDoc para saber cómo utilizar el signo de porcentaje seguido de una cadena en un par de paréntesis, tales como
%(...)
,%[...]
,%{...}
, etc., o un par de cualquier carácter no alfanumérico, como%+...+
Ultimas palabras
Por último, para obtener la respuesta a la pregunta original "¿Hay alguna forma de implicar concatenación?" respondió: Ruby siempre implica concatenación si se encuentran dos cadenas (comillas simples y dobles) consecutivas:
La advertencia es que esto no funciona a través de saltos de línea, porque Ruby está interpretando el final de la declaración y la línea consecuente de solo cadenas en una línea no hace nada.
fuente
Respuesta elegante hoy:
Hay una diferencia en
<<-TEXT
y<<~TEXT
, el primero conserva el espacio dentro del bloque y el segundo no.Hay otras opciones tambien. Como la concatenación, etc., pero esta tiene más sentido en general.
Si me equivoco aquí, avíseme cómo ...
fuente
Al igual que usted, también estaba buscando una solución que no incluye nuevas líneas . (Si bien pueden ser seguros en SQL, no lo son en mi caso y tengo un gran bloque de texto para tratar)
Esto podría decirse que es igual de feo, pero puede hacer una barra invertida para escapar de las nuevas líneas en un heredoc para omitirlas de la cadena resultante:
Tenga en cuenta que no puede hacerlo sin interpolación (IE
<<~'END_OF_INPUT'
), así que tenga cuidado.#{expressions}
serán evaluados aquí, mientras que no lo harán en su código original. La respuesta de A. Wilson puede ser mejor por esa razón.fuente