ruby-on-rails - que - ruby on rails tutorial
Desbloquear cadenas largas en múltiples líneas en Ruby sin eliminar nuevas líneas (5)
Recientemente decidimos en mi trabajo una guía de estilo Ruby. Uno de los edictos es que ninguna línea debe tener más de 80 caracteres. Dado que este es un proyecto de Rails, a menudo tenemos cadenas que son un poco más largas, es decir, "el usuario X quería enviarle un mensaje sobre la cosa Y" que no siempre encaja dentro del límite de 80 caracteres.
Entiendo que hay tres formas de tener un largo de cadena de varias líneas:
- HEREDOC
- % Q {}
- Concatenación real de cadenas.
Sin embargo, todos estos casos terminan tomando más ciclos de computación, lo que parece tonto. Concatenación de cadenas, obviamente, pero para HEREDOC y% QI tengo que eliminar las nuevas líneas, a través de algo como .gsub (/ / n $ /, '''').
¿Hay una forma de sintaxis pura para hacer esto, que es equivalente a simplemente tener toda la cadena en una línea? El objetivo es, obviamente, no gastar ningún ciclo extra solo porque quiero que mi código sea un poco más legible. (Sí, me doy cuenta de que tienes que hacer mucho daño ... pero para la longitud de la cuerda, esto parece una tontería).
Actualización: las barras diagonales inversas no son exactamente lo que quiero porque se pierde la sangría, lo que realmente afecta el estilo / legibilidad.
Ejemplo:
if foo
string = "this is a /
string that spans lines"
end
Encuentro que lo anterior es un poco difícil de leer.
EDITAR : Agregué una respuesta a continuación; tres años más tarde ahora tenemos el squiggly heredoc.
Puede usar /
para indicar que cualquier línea de Ruby continúa en la siguiente línea. Esto funciona con cadenas también:
string = "this is a /
string that spans lines"
puts string.inspect
saldrá "this is a string that spans lines"
Tal vez esto es lo que estás buscando?
string = "line #1"/
"line #2"/
"line #3"
p string # => "line #1line #2line #3"
Tres años después, ahora hay una solución en Ruby 2.3: The squiggly heredoc.
class Subscription
def warning_message
<<~HEREDOC
Subscription expiring soon!
Your free trial will expire in #{days_until_expiration} days.
Please update your billing information.
HEREDOC
end
end
Enlace de la publicación del blog: https://infinum.co/the-capsized-eight/articles/multiline-strings-ruby-2-3-0-the-squiggly-heredoc
La sangría de la línea menos sangrada se eliminará de cada línea del contenido.
Tuve este problema cuando intento escribir una url muy larga, los siguientes trabajos.
image_url = %w(
http://minio.127.0.0.1.xip.io:9000/
bucket29/docs/b7cfab0e-0119-452c-b262-1b78e3fccf38/
28ed3774-b234-4de2-9a11-7d657707f79c?
X-Amz-Algorithm=AWS4-HMAC-SHA256&
X-Amz-Credential=AJAKJFAFGAKAJDDAF
%2Fus-east-1%2Fs3%2Faws4_request&
X-Amz-Date=20170702T000940Z&
X-Amz-Expires=3600&X-Amz-SignedHeaders=host&
X-Amz-Signature=QEWKJRQJEWR813247812347FKFS
KQWREJQ3108418324732o45o1324kldsfjasf
).join
Tenga en cuenta que no debe haber líneas nuevas, espacios en blanco cuando se forma la cadena url. Si desea nuevas líneas, entonces use HEREDOC.
Aquí tiene sangría para legibilidad, facilidad de modificación, sin las comillas y las barras invertidas en cada línea. El costo de unirse a las cadenas debe ser insignificante.
Modifiqué la respuesta de Zack porque quería espacios e interpolación, pero no nuevas líneas y uso:
%W[
It''s a nice day "#{name}"
for a walk!
].join('' '')
donde name = ''fred''
esto produce ¡ It''s a nice day "fred" for a walk!