2009-02-12 21 views
5

Poniższy kod generuje wyjście „xyz”tym spacje podczas korzystania% wag

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

Czy istnieje opcja, która może być dodana do bloku, aby umożliwić obowiązuje do dodania?

Na przykład, myślałem że przez zmianę kodu do tego, że mogę być w stanie czasoprzestrzeni oddzielenia elementów produkować moc „xyz”

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

Zamiast produkuje to:

"x" "y" "z"

Odpowiedz

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

lub

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

lub

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

Nie wiedziałem, że możesz to zrobić w ten sposób. Dzięki. –

+1

Problem jaki masz to to, że array.to_s w Ruby przed 1.9 po prostu utknął wszystkie elementy end-to-end. Problem nie pojawił się w danych macierzy, ale w metodzie, która wydrukowała tablicę. Właśnie dlatego% w {x y z} .join ('') działa poprawnie. Aby uwzględnić spacje w wartościach w% w tablicy, użyj "\" (backslash-space). – Chuck

2

Nie używaj do tego celu %w - jest to skrót do sytuacji, gdy chcesz podzielić tablicę na słowa. W przeciwnym razie, należy standardowego zapisu tablicy:

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

można przez to przestrzeni ucieczki backslashem-im (następnie dodanie dodatkowej przestrzeni jako separatora).

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

Może to jednak być trudne do odczytania. Jeśli chcesz umieścić tam wyraźne cudzysłowy, nie potrzebujesz %w{}, wystarczy użyć zwykłej tablicy rozdzielanej przecinkami z [].

+0

wspaniałe. Dzięki. –

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 
Powiązane problemy