265

私たちは最近、私の仕事でルビー スタイル ガイドを採用することに決めました。勅令の 1 つは、どの行も 80 文字を超えてはならないというものです。これは Rails プロジェクトであるため、少し長い文字列がよくあります。たとえば、「ユーザー X がモノ Y についてのメッセージをあなたに送りたいと思っています」という文字列は、必ずしも 80 文字のスタイル制限内に収まるとは限りません。

長い文字列を複数行にまたがるには、次の 3 つの方法があることを理解しています。

  • ヘレドック
  • %Q{}
  • 実際の文字列連結。

ただし、これらのケースはいずれも最終的にはより多くの計算サイクルが必要になるため、ばかげているように思えます。文字列の連結は明らかですが、 forHEREDOC%Qのような方法で改行を削除する必要があり.gsub(/\n$/, '')ます。

これを行うための純粋な構文の方法はありますか?これは、文字列全体を 1 行に配置するのと同じですか? 目標は、明らかに、コードをもう少し読みやすくしたいという理由だけで余分なサイクルを費やさないことです。(はい、そのトレードオフをたくさんしなければならないことは理解しています...しかし、文字列の長さについては、これはばかげているようです。)

更新: インデントが失われ、スタイル/読みやすさに実際に影響するため、バックスラッシュは私が望むものではありません。

例:

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

上の文章は読みにくいと思います。

編集:以下に回答を追加しました。3 年後、波打ったヒアドキュメントができました。

4

8 に答える 8

503

多分これはあなたが探しているものですか?

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

p string # => "line #1line #2line #3"
于 2012-05-09T21:10:20.643 に答える
65

\Rubyの任意の行が次の行に続くことを示すために使用できます。これは文字列でも機能します。

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

puts string.inspect

出力します"this is a string that spans lines"

于 2012-05-09T19:01:53.190 に答える
56

それから 3 年が経ち、Ruby 2.3 には解決策があります。波線のヒアドキュメントです。

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

コンテンツの各行から、最もインデントされていない行のインデントが削除されます。

于 2016-10-03T08:57:09.337 に答える