2009-02-12 7 views
5

Il seguente codice produce l'output "xyz"spazi inclusi durante l'utilizzo% w

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

Esiste un'opzione che può essere aggiunto al blocco per consentire spazi da aggiungere?

Ad esempio, ho pensato che cambiando il codice a questo potrei essere in grado di spazio-separare gli elementi per produrre un'uscita di "xyz"

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

Invece produce questo:

"x" "y" "z"

risposta

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

o

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

o

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

Non sapevo che potessi farlo in questo modo. Grazie. –

+1

Il problema che hai avuto è che array.to_s in Ruby prima di 1.9 ha appena bloccato tutti gli elementi end-to-end. Il problema non era nei dati dell'array, ma nel metodo che stampava la matrice. Ecco perché% w {x y z} .join ('') funziona bene. Inoltre, per includere spazi in valori di matrice% w, utilizzare "\" (backslash-space). – Chuck

2

Per questo non utilizzare %w: è una scorciatoia per quando si desidera dividere un array dalle parole. Altrimenti, usare la notazione matrice norma:

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

È possibile includere spazi di backslash-fuoriuscita loro (quindi aggiungendo uno spazio aggiuntivo come separatore).

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

Questo può diventare difficile da leggere però. Se si desidera inserire tra virgolette esplicite, non è necessario %w{}, utilizzare solo una matrice normale delimitata da virgole con [].

+0

meraviglioso. Grazie. –

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