2012-05-09 5 views
165

私は最近、自分の仕事でルビースタイルのガイドを決めました。勅令の1つは、80文字を超える行がないことです。これはRailsプロジェクトなので、文字列の長さが少し長くなっていることがよくあります。つまり、「ユーザーXは80文字のスタイル制限内に収まるとは限らない」というメッセージを送信したかったのです。改行を取り除かずにRubyの複数の行に長い文字列を分割する

  • ヒアドキュメント
  • %のQ {}
  • 実際の文字列連結:

    Iは、長い文字列のスパン複数の行を持つ3つの方法があります理解します。

しかし、これらのケースはすべて、計算サイクルが増えてしまい、愚かなようです。文字列連結は明らかですが、HEREDOCと%Qでは、.gsub(/ \ n $ /、 '')のような方法で改行を取り除かなければなりません。

これを行うための純粋な構文方法はありますか?それは1行にすべての文字列を入れることと同じですか?目標は明らかに、コードを少しだけ読みやすくするために余分なサイクルを費やさないことです。 (はい、私はあなたがそのトレードオフをたくさん作るために持っていることを実感...しかし、文字列の長さのために、これは単なる愚かなようです。)

更新:あなたは本当にインデントを、失うため バックスラッシュは私が望んでいないされている正確に何スタイル/読みやすさに影響します。

例:

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

私は読みにくい少し上に見つけます。

EDIT:以下の回答を追加しました。 3年後、私たちは今、不思議なヘレドックを持っています。

+0

を生成

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

: – Cheezmeister

+4

[Ruby:連結なしで複数行の文字列を書くことはできますか?](http://stackoverflow.com/questions/2337510/ruby-can-i-write-multi-line-string-with-no- – givanse

+0

改行文字を '\ n'にするかどうかは不明です。一番上の答えはそれらを保持しませんが、あなたの答えはあります。問題は「改行を取り除くことなく」と書いてありますが、「[...]私は改行を取り除く必要があります。 –

答えて

22

3年後、Ruby 2.3:squiggly heredocに解決策が追加されました。

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 

ブログポストのリンクは:https://infinum.co/the-capsized-eight/articles/multiline-strings-ruby-2-3-0-the-squiggly-heredoc

少なくとも-インデント行のインデントは は、コンテンツの各ラインから削除されます。

+9

「<<〜HEREDOC」は改行文字を保持し、インデントを削除するだけです。例えば。 'line 1 \ nline 2 \ nline 3 \ n' –

+0

改行を削除するには、余分な計算が必要ですが、OPのソートが望ましくない場合があります。 – henrebotha

43

\を使用すると、Rubyの行が次の行に続いていることを示すことができます。これは、あまりにも文字列を使用しています:

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

puts string.inspect 

意志出力"this is a string that spans lines"

+9

ハァッ。それはかなり簡単です。まあ、それはおそらくあまりにも尋ねるが、私は次の行をインデントすることはできません。私はそれを等号とマッチさせることができれば理想的だろう。 – chug2k

+3

注:バックスラッシュの後に空白を入れることはできません。それは最後の文字でなければなりません。 –

+1

@Jessehzの答えを見てください。適切な字下げで適切に書式設定されたコードを作成する方法は、各行を引用符で囲むことです。 – orrd

325

たぶん、これはあなたが探しているものでしょうか?

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

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

ハァッ。ええ、それはかなり完璧です。実際にはボンネットの下で連結しているのですか? (+?を隠して) – chug2k

+10

私はかなりそれがないと確信しています。私はundef'ingとString#+を再定義しようとしましたが、何も送られていないようです。 – Jessehz

+0

また、同じ行に文字列を並べることもできますが、これはあまり役に立ちません。 – Jessehz

6

非常に長いURLを書き込もうとすると、この問題が発生しました。次のように動作します。

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 

URL文字列が作成されるときに、改行や空白があってはいけません。改行が必要な場合は、HEREDOCを使用してください。

ここには、読みやすくするための字下げがあります。改行は、すべての行に二重引用符とバックスラッシュを付けずに行います。文字列を結合するコストは無視してください。 name = 'fred'が、これはそれらの文字列を考慮するあなたの中の価値があるかもしれIt's a nice day "fred" for a walk!

2

は、私は私 スペースと補間ではなく、改行と使用を望んでいたので、ザックの答えを変更しました。
関連する問題