6

Ruby (クライアント スクリプト) を書いているとき、行末を含む長い文字列を作成する方法が 3 つあります。

よりクリーンでより良い方法はありますか?

可変インクリメント。

if render_quote?
  quote =  "Now that there is the Tec-9, a crappy spray gun from South Miami."
  quote += "This gun is advertised as the most popular gun in American crime. Do you believe that shit?"
  quote += "It actually says that in the little book that comes with it: the most popular gun in American crime."
  quote += "Like they're actually proud of that shit."
  puts quote
end

ヒアドキュメント (および閉じられていない引用符)。

if render_quote?
  quote =<<EOS
Now that there is the Tec-9, a crappy spray gun from South Miami.
This gun is advertised as the most popular gun in American crime. Do you believe that shit?
It actually says that in the little book that comes with it: the most popular gun in American crime.
Like they're actually proud of that shit.
EOS

  puts quote
end

または、単純に終了タグを追加しない:

if render_quote?
  quote = "Now that there is the Tec-9, a crappy spray gun from South Miami.
This gun is advertised as the most popular gun in American crime. Do you believe that shit?
It actually says that in the little book that comes with it: the most popular gun in American crime.
Like they're actually proud of that shit."

  puts quote
end

または、必要に応じて、gsub を使用して識別の問題を修正します(yuk!?)。

連結。

if render_quote?
  quote =  "Now that there is the Tec-9, a crappy spray gun from South Miami."
  quote += "This gun is advertised as the most popular gun in American crime. Do you believe that shit?"
  quote += "It actually says that in the little book that comes with it: the most popular gun in American crime."
  quote += "Like they're actually proud of that shit."
  puts quote
end

(サミュエル・L・イプサムからの引用)

スクリプトにそのような文字列 (つまりビュー ロジック) があること自体が臭いことは承知していますが、これをクリーンアップするためのパターン (po ファイルなど以外) を知りません。

4

3 に答える 3

5

隣接する文字列リテラルは連結されることに注意してください。これを行継続文字と組み合わせることができます\

if render_quote?
  quote =
  "Now that there is the Tec-9, a crappy spray gun from South Miami. " \
  "This gun is advertised as the most popular gun in American crime. " \
  "Do you believe that shit?" \
  "It actually says that in the little book that comes with it: " \
  "the most popular gun in American crime. " \
  "Like they're actually proud of that shit."
  puts quote
end
于 2012-11-13T12:22:36.497 に答える
2

その後、あなたのコードはダッシュで機能しませんでした...しかし、これは機能し、新しい行を追加でエスケープする必要はなく、HereDocで何をしているのかを単純に示しています。

if render_quote?
  quote = <<-EOS.strip.split.join(' ')
    Now that there is the Tec-9, a crappy spray gun from South Miami.
    This gun is advertised as the most popular gun in American crime. Do you believe that shit?
    It actually says that in the little book that comes with it: the most popular gun in American crime.
    Like they're actually proud of that shit.
  EOS

  puts quote
end

EOS の前のダッシュは、EOS をインデント方式で使用できることを意味します。

于 2012-11-13T14:04:30.713 に答える
2

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

インデントを気にしない場合は、次のように %Q{} 構文を使用することもできます。%Q は文字列置換を行いますが、%q は行いません。

warning_message = %Q{
  Subscription expiring soon!
  Your free trial will expire in #{days_until_expiration} days.
  Please update your billing information.
}
于 2018-11-06T17:28:12.597 に答える