2013-04-05 47 views
17

Giả sử tôi muốn có một khối mã rất lớn của đoạn mã html được in đẹp với mã ruby ​​của tôi. Cách sạch nhất để làm điều này mà không mất bất kỳ định dạng trong chuỗi của tôi hoặc phải nhớ một số loại regex gsub là gì.Có cách nào dễ dàng để thực hiện chuỗi thụt lề đa dòng trong Ruby không?

Encoding nó tất cả trong một dòng rất dễ làm nhưng khó đọc:

1.times do 
    # Note that the spaces have been changed to _ so that they are easy to see here. 
    doc = "\n<html>\n__<head>\n____<title>\n______Title\n____</title>\n__</head>\n__<body>\n____Body\n__</body>\n</html>\n" 
    ans = "Your document: %s" % [doc] 
    puts ans 
end 

Multiline văn bản trong ruby ​​là dễ dàng hơn để đọc nhưng chuỗi không thể thụt vào với phần còn lại của mã:

1.times do 
    doc = " 
<html> 
    <head> 
    <title> 
     Title 
    </title> 
    </head> 
    <body> 
    Body 
    </body> 
</html> 
" 
    ans = "Your document: %s" % [doc] 
    puts ans 
end 

Ví dụ sau đây là thụt vào với mã của tôi, nhưng chuỗi hiện nay có bốn không gian thêm trước mỗi dòng:

1.times do 
    doc = <<-EOM 

    <html> 
     <head> 
     <title> 
      Title 
     </title> 
     </head> 
     <body> 
     Body 
     </body> 
    </html> 
    EOM 
    ans = "Your document: %s" % [doc] 
    puts ans 
end 

Hầu hết mọi người đi với mã HEREDOC ở trên, và thực hiện một regex thay thế trên kết quả để lấy ra khoảng trống thừa ở đầu mỗi dòng. Tôi muốn một cách mà tôi không phải trải qua những rắc rối của sự hối hận mỗi lần.

+1

Check-out - http://stackoverflow.com/questions/3350648/ruby-indented-multiline-strings – theglauber

+1

Ngoài ra - http: // stackoverflow.com/questions/3772864/how-do-i-remove-hàng đầu-khoảng trắng-chars-từ-ruby-heredoc – theglauber

+0

'Tôi có một chuỗi (" khi \ n \ n đồng hồ \ n cảnh \ n mười \ n ") sẽ sạch hơn nếu nó có thể được gõ vào với các ký tự dòng mới thực sự.' không có ý nghĩa. '" \ n "' là các ký tự dòng mới thực sự. –

Trả lời

19
string = %q{This 
    is 
     indented 
    and 
    has 
     newlines} 

Here là một blog với một số ví dụ về %q{}, %Q{} và những người khác.

Theo như dễ nhớ, hãy suy nghĩ 'Q' cho 'Dấu ngoặc kép'.

Sidenote: Về mặt kỹ thuật, bạn không cần 'q' trong khi thực hiện báo giá.

string = %{This 
    also 
     is indented 
    and 
    has 
    newlines 
     and handles interpolation like 1 + 1 = #{1+1} 
} 

Tuy nhiên, thực hành tốt nhất và dễ đọc hơn để sử dụng %Q{}.

+1

'+ 1' cho liên kết blog. :) –

+0

Tôi thích% q {},% Q {} và% {}. Tuy nhiên tôi muốn chuỗi được thụt vào bằng mã của tôi. Tôi viết lại câu hỏi của mình để nó rõ ràng hơn. –

3

Nó không thực sự rõ ràng những gì bạn đang yêu cầu. Nếu tôi muốn tạo ra chuỗi như:

"when \n the\n clock\n strikes\n ten\n" 

khi đang bay, tôi muốn xây dựng chúng tự động:

%w[when the clock strikes ten].join("\n ") 
=> "when\n the\n clock\n strikes\n ten" 

Kết nối một trailing "\n" sẽ thêm sự trở lại vận chuyển trailing:

%w[when the clock strikes ten].join("\n ") + "\n" 
=> "when\n the\n clock\n strikes\n ten\n" 

Nếu tôi đang xử lý các chuỗi con có không gian được nhúng, tôi sẽ điều chỉnh mảng thành:

['when the', 'clock strikes', 'ten'].join("\n ") + "\n" 
=> "when the\n clock strikes\n ten\n" 
+0

Bạn đúng là câu hỏi khó hiểu. Tôi viết lại nó. Hy vọng rằng nó dễ hiểu hơn bây giờ. –

15

Kể từ của Ruby 2.3, các <<~ dải heredoc hàng đầu khoảng trắng nội dung:

def make_doc(body) 
    <<~EOF 
    <html> 
    <body> 
     #{body} 
    </body> 
    </html> 
    EOF 
end 

puts make_doc('hello') 

Đối với các phiên bản của Ruby trở lên, sau đây là nhiều tiết hơn so với các giải pháp thể hiện trong câu trả lời khác, nhưng có hầu như không có hiệu quả chi phí. Đó là về nhanh như một chuỗi duy nhất dài đen:

def make_doc(body) 
    "<html>\n"  \ 
    " <body>\n"  \ 
    " #{body}\n" \ 
    " </body>\n" \ 
    "</html>" 
end 
Các vấn đề liên quan