2009-02-12 42 views
5

Đoạn mã dưới đây sẽ cho kết quả "xyz"bao gồm khoảng trắng trong khi sử dụng% w

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

Có một tùy chọn có thể được bổ sung vào khối để cho phép không gian để được bổ sung?

Ví dụ, tôi nghĩ rằng bằng cách thay đổi mã để này, tôi có thể có thể không gian tách biệt các yếu tố để tạo ra một sản phẩm của "xyz"

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

Thay vào đó nó tạo ra này:

"x" "y" "z"

Trả lời

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

hoặc

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

hoặc

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

Tôi không biết bạn có thể làm theo cách này. Cảm ơn. –

+1

Sự cố bạn gặp phải là array.to_s trong Ruby trước 1.9 chỉ bị kẹt tất cả các phần tử từ đầu đến cuối. Vấn đề không nằm trong dữ liệu mảng của bạn, mà là phương thức in mảng. Đó là lý do tại sao% w {x y z} .join ('') hoạt động tốt. Ngoài ra, để bao gồm dấu cách trong một giá trị mảng% w, hãy sử dụng dấu "\" (dấu gạch chéo ngược). – Chuck

2

Không sử dụng %w cho điều này - đó là lối tắt cho thời điểm bạn muốn tách mảng khỏi các từ. Nếu không, hãy sử dụng ký hiệu mảng tiêu chuẩn:

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

Bạn có thể bao gồm dấu cách bằng dấu gạch chéo ngược (sau đó thêm khoảng trắng làm dấu tách).

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

Điều này có thể khó đọc. Nếu bạn muốn đặt dấu ngoặc kép rõ ràng trong đó, bạn không cần %w{}, chỉ cần sử dụng mảng được phân cách bằng dấu phẩy thông thường với [].

+0

tuyệt vời. Cảm ơn. –

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 
Các vấn đề liên quan