1. ホーム
  2. ruby-on-rails

[解決済み】Rubyで複数行の長い文字列を改行せずに分割する方法

2022-05-06 19:14:23

質問

最近、私の仕事場でrubyのスタイルガイドが決まりました。その中の一つに、「行の幅は80文字まで」というのがあります。Railsのプロジェクトなので、もう少し長い文字列、例えば" ユーザーXは、物事Yについてあなたにメッセージを送りたがっていました 80文字のスタイル制限に収まらない場合もあります。

長い文字列を複数行にまたがるようにするには、3つの方法があると聞いています。

  • ヘレドック
  • %Q{}
  • 実際に文字列を連結する

しかし、これらのケースはいずれも、結局はより多くの計算サイクルを要しており、馬鹿げているとしか思えません。文字列の連結は当然ですが、例えば HEREDOC%Q のような方法で、改行を削除しなければなりません。 .gsub(/\n$/, '') .

これを行うための純粋な構文で、文字列全体を1行で表示するのと同等の方法はありますか?目標は、明らかに、私のコードを少し読みやすくしたいからと言って、余分なサイクルを費やさないことです。(そうです、私はあなたが多くのトレードオフをしなければならないことを理解しています...しかし、文字列の長さのために、これはちょうど愚かに思えます)。

更新しました。 バックスラッシュは、インデントが失われるため、スタイルや読みやすさに大きく影響するため、私が望むものとは異なります。

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

上記はちょっと読みにくいですね。

<ブロッククオート

EDIT : 下に答えを追加しました。3年後、私たちは今、スクイグリーヘレドックを手に入れました。

解決方法は?

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

<ブロッククオート

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