2009-02-12 13 views
5

El siguiente código produce la salida "xyz"incluidos los espacios durante el uso de% w

a = %w{x y z} 
print a.to_s 

¿Hay una opción que puede ser añadido al bloque para permitir que los espacios que han de añadirse?

Por ejemplo, pensé que cambiando el código para esta podría ser capaz de espacio-separar los elementos para producir una salida de "xyz"

a = %w{"x " "y " "z "} 
print a.to_s 

lugar de ello, produce esto:

"x" "y" "z"

Respuesta

2
a = ["xyz"].split("").join(" ") 

o

a = ["x","y","z"].join(" ") 

o

a = %w(x y z).join(" ") 
+0

No sabía que pudieras hacerlo de esta manera. Gracias. –

+1

El problema que tenías era que array.to_s en Ruby antes de 1.9 solo pegaba todos los elementos de extremo a extremo. El problema no estaba en los datos de su matriz, sino en el método que imprimió la matriz. Es por eso que% w {x y z} .join ('') funciona bien. Además, para incluir espacios en un% w valores de matriz, use "\" (barra diagonal inversa). – Chuck

2

No use %w para esto; es un acceso directo para cuando desea dividir una matriz de palabras. De lo contrario, utilizar la matriz estándar notación:

a = ["x ", "y ", "z "] 
5

Puede incluir espacios por backslash-escapar ellos (a continuación, la adición de un espacio adicional como separador).

a = %w{x\ y\ z\ } 

Aunque esto puede ser difícil de leer. Si desea poner comillas explícitas allí, no necesita %w{}, simplemente use una matriz normal delimitada por comas con [].

+0

maravilloso. Gracias. –

0
def explain 
    puts "double quote equivalents" 
    p "a b c", %Q{a b c}, %Q(a b c), %(a b c), %<a b c>, %!a b c! # & etc 
    puts 

    puts "single quote equivalents" 
    p 'a b c', %q{a b c}, %q(a b c), %q<a b c>, %q!a b c! # & etc. 
    puts 

    puts "single-quote whitespace split equivalents" 
    p %w{a b c}, 'a b c'.split, 'a b c'.split(" ") 
    puts 

    puts "double-quote whitespace split equivalents" 
    p %W{a b c}, "a b c".split, "a b c".split(" ") 
    puts 
end 

explain 

def extra_credit 
    puts "Extra Credit" 
    puts 

    test_class = Class.new do 
    def inspect() 'inspect was called' end 
    def to_s() 'to_s was called' end 
    end 

    puts "print" 
    print test_class.new 
    puts "(print calls to_s and doesn't add a newline)" 
    puts 

    puts "puts" 
    puts test_class.new 
    puts "(puts calls to_s and adds a newline)" 
    puts 

    puts "p" 
    p test_class.new 
    puts "(p calls inspect and adds a newline)" 
    puts 
end 

extra_credit 
Cuestiones relacionadas