2012-05-09 40 views
165

Gần đây, chúng tôi đã quyết định công việc của mình cho một hướng dẫn kiểu Ruby. Một trong những nguyên tắc là không có dòng nào rộng hơn 80 ký tự. Vì đây là dự án Rails, chúng tôi thường có chuỗi dài hơn một chút - tức là "Người dùng X muốn gửi cho bạn thông báo về Thing Y" không phải lúc nào cũng phù hợp với giới hạn kiểu 80 ký tự.Phá vỡ các chuỗi dài trên nhiều dòng trong Ruby mà không tước các dòng mới

Tôi hiểu có ba cách để có một dài khoảng chuỗi nhiều dòng:

  • HEREDOC
  • % Q {}
  • thực tế nối chuỗi.

Tuy nhiên, tất cả các trường hợp này sẽ phải mất nhiều chu kỳ tính toán hơn, điều này có vẻ ngớ ngẩn. Kết nối chuỗi rõ ràng, nhưng đối với HEREDOC và% Q tôi phải loại bỏ các dòng mới, thông qua một cái gì đó như .gsub (/ \ n $ /, '').

Có cách cú pháp thuần túy để thực hiện việc này hay không, điều đó tương đương với việc chỉ có toàn bộ chuỗi trên một dòng? Mục đích là, rõ ràng, không phải tốn thêm bất kỳ chu kỳ nào chỉ vì tôi muốn mã của tôi có thể đọc được nhiều hơn một chút. (Vâng, tôi nhận ra rằng bạn phải làm cho sự cân bằng đó rất nhiều ... nhưng đối với chiều dài chuỗi, điều này có vẻ ngớ ngẩn.)

Cập nhật: Lùi chéo không chính xác những gì tôi muốn bởi vì bạn mất thụt đầu dòng, mà thực sự ảnh hưởng đến phong cách/khả năng đọc.

Ví dụ:

if foo 
    string = "this is a \ 
string that spans lines" 
end 

tôi thấy ở trên một chút khó đọc.

EDIT: Tôi đã thêm câu trả lời bên dưới; ba năm sau, chúng tôi bây giờ có một con chim bồ câu.

+0

Nó có thể là giá trị trong khi của bạn yếu tố ra những chuỗi. – Cheezmeister

+4

có thể trùng lặp của [Ruby: Tôi có thể viết chuỗi nhiều dòng không có nối không?] (Http://stackoverflow.com/questions/2337510/ruby-can-i-write-multi-line-string-with-no- concatenation) – givanse

+0

Không rõ liệu bạn có muốn giữ '\ n' ký tự dòng mới hay không. Câu trả lời hàng đầu không giữ chúng - nhưng câu trả lời của bạn là không. Câu hỏi nói "không tước các dòng mới" —yêu cầu mô tả nói "[...] Tôi phải loại bỏ các dòng mới". –

Trả lời

22

Ba năm sau, hiện tại có một giải pháp trong Ruby 2.3: The heredoc squiggly.

class Subscription 
    def warning_message 
    <<~HEREDOC 
     Subscription expiring soon! 
     Your free trial will expire in #{days_until_expiration} days. 
     Please update your billing information. 
    HEREDOC 
    end 
end 

Blog post link: https://infinum.co/the-capsized-eight/articles/multiline-strings-ruby-2-3-0-the-squiggly-heredoc

Các thụt đầu dòng của dòng kém thụt vào sẽ được lấy ra từ mỗi dòng của nội dung.

+9

Đối với bất cứ ai khác tự hỏi: '<< ~ HEREDOC' giữ các ký tự dòng mới, nó chỉ rids của thụt đầu dòng. Ví dụ. 'dòng 1 \ nline 2 \ nline 3 \ n' –

+0

Tước dòng mới vẫn sẽ yêu cầu tính toán bổ sung, mặc dù, loại OP ngụ ý là không mong muốn. – henrebotha

43

Bạn có thể sử dụng \ để cho biết rằng bất kỳ dòng nào của Ruby tiếp tục trên dòng tiếp theo. Này làm việc với chuỗi quá:

string = "this is a \ 
string that spans lines" 

puts string.inspect 

chí đầu ra "this is a string that spans lines"

+9

huh. điều đó khá đơn giản. tốt, có lẽ quá nhiều để hỏi, nhưng tôi không thể thụt dòng tiếp theo. nó sẽ là lý tưởng nếu tôi có thể kết hợp nó với dấu bằng. – chug2k

+3

Lưu ý: bạn không thể có bất kỳ khoảng trắng nào sau dấu gạch chéo ngược đó. Nó phải là nhân vật cuối cùng. –

+1

Xem câu trả lời của @Jessehz. Cách để có mã định dạng độc đáo với thụt lề thích hợp là đặt mỗi dòng trong dấu ngoặc kép. – orrd

325

Có lẽ đây là những gì bạn đang tìm kiếm?

string = "line #1"\ 
     "line #2"\ 
     "line #3" 

p string # => "line #1line #2line #3" 
+2

huh. vâng, đó là khá hoàn hảo. là thực sự làm một nối dưới mui xe? (giấu một +?) – chug2k

+10

Tôi khá chắc chắn rằng nó không phải; Tôi đã thử cả hai undef'ing và redefining String # + và nó không có vẻ như bất cứ điều gì đang được gửi ở đó. – Jessehz

+0

Ngoài ra, đặt các chuỗi bên cạnh nhau trên cùng một dòng cũng hoạt động, nhưng điều đó không phải là rất hữu ích. – Jessehz

6

Tôi gặp sự cố này khi cố gắng viết một url rất dài, các công trình sau đây.

image_url = %w(
    http://minio.127.0.0.1.xip.io:9000/ 
    bucket29/docs/b7cfab0e-0119-452c-b262-1b78e3fccf38/ 
    28ed3774-b234-4de2-9a11-7d657707f79c? 
    X-Amz-Algorithm=AWS4-HMAC-SHA256& 
    X-Amz-Credential=AJAKJFAFGAKAJDDAF 
    %2Fus-east-1%2Fs3%2Faws4_request& 
    X-Amz-Date=20170702T000940Z& 
    X-Amz-Expires=3600&X-Amz-SignedHeaders=host& 
    X-Amz-Signature=QEWKJRQJEWR813247812347FKFS 
    KQWREJQ3108418324732o45o1324kldsfjasf 
).join 

Lưu ý, không được có bất kỳ dòng mới nào, khoảng trắng khi chuỗi url được tạo. Nếu bạn muốn dòng mới, sau đó sử dụng HEREDOC.

Ở đây bạn có thụt đầu dòng để dễ đọc, dễ sửa đổi, không có dấu ngoặc kép và dấu gạch chéo ngược khó chịu trên mọi dòng. Chi phí tham gia các chuỗi nên không đáng kể.

2

tôi sửa đổi câu trả lời của Zack kể từ khi tôi muốn không gian và nội suy nhưng không newlines và sử dụng:

%W[ 
    It's a nice day "#{name}" 
    for a walk! 
].join(' ') 

nơi name = 'fred' này tạo It's a nice day "fred" for a walk!

Các vấn đề liên quan