2009-10-12 18 views
15

Aquí hay algo que hago a menudo cuando se programa:construcción cadenas multilínea, mediante programación, en Ruby

code = '' 
code << "next line of code #{something}" << "\n" 
code << "another line #{some_included_expression}" << "\n" 

¿Hay alguna manera mejor que tener << "\n" o + "\n" en cada línea? Esto parece bastante ineficiente.

Me interesan las soluciones de Ruby, en particular. Estoy pensando en algo así como

code = string.multiline do 
    "next line of code #{something}" 
    "another line #{some_included_expression}" 
end 

Respuesta

15

Ésta sería una manera:

code = [] 
code << "next line of code #{something}" 
code << "another line #{some_included_expression}" 
code.join("\n") 
+4

puede perder la variable: '[" first line "," second line "]. join (" \ n ")' – jaredjacobs

9

Uso < < - operador:

code = <<-CODE 
var1 = "foo" 
var2 = "bar" 
CODE 
+0

Esto se ve muy bien (supongo que es un documento AQUÍ), pero conserva el espacio en blanco al principio de las líneas. cualquier forma de deshacerse de eso? – Peter

+0

'code = << - CODE.gsub (/^\ s + /, '')' seguido del heredoc como de costumbre. –

+0

de cerca, pero también quiero que preserve la sangría ... es solo el * espacio en blanco * extra que debería desaparecer. sí, sé una solución alternativa, pero es feo. – Peter

3

He aquí un método que se presenta here:

str = <<end.margin 
    |This here-document has a "left margin" 
    |at the vertical bar on each line. 
    | 
    | We can do inset quotations, 
    | hanging indentions, and so on. 
end 

Esto se logra mediante el uso de esto:

class String 
    def margin 
    arr = self.split("\n")    # Split into lines 
    arr.map! {|x| x.sub!(/\s*\|/,"")} # Remove leading characters 
    str = arr.join("\n")    # Rejoin into a single line 
    self.replace(str)     # Replace contents of string 
    end 
end 

Supongo que la pregunta con esto es: ¿la falta de portabilidad/mono presencia de parches hacen de esta mala solución.

+0

En lugar de tener que poner un "|" prefijo para cada línea Y también cambiando la clase String, ¿por qué no usar "código <<" como en mi respuesta? Puede acortar el nombre de la variable 'código' para que sea 'd'. Es fácil de entender y cualquier programador de Ruby debería ser capaz de resolverlo. – Jim

5

Sería trabajar para que usted acaba de inserción ... \ n" en sus cadenas, supongo que aquí es una manera divertida de hacerlo:.

class String 
    def/s 
    self << s << "\n" 
    end 
end 

continuación

f = ""   # => "" 
f/'line one' # => "line one\n" 
f/'line two' # => "line one\nline two\n" 
f/'line three' # => "line one\nline two\nline three\n" 

Este permitiría algo así como:

""/"line 1"/"line 2"/"line 3" # => "line 1\nline 2\nline 3\n" 

O incluso:

f/ 
"line one"/ 
"line two"/ 
"line three"  # => "line one\nline two\nline three\n" 
26

Si está buscando construir un bloque de texto, la manera más fácil de hacerlo es simplemente usar el operador%. Por ejemplo:

code = %{First line 
second line 
Third line #{2 + 2}} 

'código' a continuación, habrá

"First line\n second line\n Third line 4" 
+2

+1. También solo para aquellos que lean esto no es necesario usar% {string} ... cualquier personaje lo hará. Por ejemplo% -string- o% ~ string ~ – kinofrost

0

podría colocar su texto de varias líneas en un archivo, y el uso de ERB analizarlo (Nota ERB se incluye con Ruby)

require 'erb' 

multi_line_string = File.open("multi_line_string.erb", 'r').read 
template = ERB.new(multi_line_string) 
template.result(binding) 

(ERB puede acceder a las variables de una, un objeto de encuadernación que proporciona acceso a los métodos de instancia y variables que son propiedad de otro objeto. al establecer a "unión" que apunta a sí mismo)

Documentación here.

0

¿Qué hay de malo en:

code = "next line of code #{something}\n"+ 
     "another line #{some_included_expression}" 
Cuestiones relacionadas