Ruby:変数を文字列にマージする


95

Rubyで、変数を文字列にマージするより良い方法を探しています。

たとえば、文字列が次のような場合:

「」animal actionsecond_animal

そしてanimalactionとのsecond_animal変数があります。これらの変数を文字列に入れるための好ましい方法は何ですか?

回答:


240

慣用的な方法は次のようなものを書くことです:

"The #{animal} #{action} the #{second_animal}"

文字列を囲む二重引用符( ")に注意してください。これは、Rubyが組み込みのプレースホルダー置換を使用するためのトリガーです。単一引用符( ')で置き換えることはできません。そうしないと、文字列はそのまま保持されます。


2
申し訳ありませんが、多分問題を単純化しすぎました。文字列はデータベースから取得され、変数はいくつかの要素に依存します。通常、私は1つまたは2つの変数の代わりに使用しますが、これはさらに多くの可能性があります。何かご意見は?
FearMediocrity 2009

#{}構成はおそらく最速です(ただし、それでも私には直観に反するように見えます)。gixの提案と同様に、+または<<を使用して文字列を組み立てることもできますが、いくつかの中間文字列が作成される可能性があり、コストがかかります。
Mike Woodhouse、

変数を補間する最良の方法
Dragutescu Alexandru

115

sprintfのようなフォーマットを使用して、文字列に値を挿入できます。そのため、文字列にはプレースホルダーを含める必要があります。引数を配列に入れ、次の方法で使用します(詳細については、Kernel :: sprintfのドキュメントを参照しください)。

fmt = 'The %s %s the %s'
res = fmt % [animal, action, other_animal]  # using %-operator
res = sprintf(fmt, animal, action, other_animal)  # call Kernel.sprintf

引数番号を明示的に指定して、それらをシャッフルすることもできます。

'The %3$s %2$s the %1$s' % ['cat', 'eats', 'mouse']

または、ハッシュキーを使用して引数を指定します。

'The %{animal} %{action} the %{second_animal}' %
  { :animal => 'cat', :action=> 'eats', :second_animal => 'mouse'}

%演算子のすべての引数に値を指定する必要があることに注意してください。たとえば、の定義は避けられませんanimal


18

#{}他の答えで述べたように、コンストラクタを使用します。私はまた、ここで気をつけるべき本当の微妙な点があることを指摘したいと思います:

2.0.0p247 :001 > first_name = 'jim'
 => "jim" 
2.0.0p247 :002 > second_name = 'bob'
 => "bob" 
2.0.0p247 :003 > full_name = '#{first_name} #{second_name}'
 => "\#{first_name} \#{second_name}" # not what we expected, expected "jim bob"
2.0.0p247 :004 > full_name = "#{first_name} #{second_name}"
 => "jim bob" #correct, what we expected

文字列は単一引用符で作成できます(first_nameおよびlast_name変数で示されているように)#{}コンストラクターは二重引用符で囲まれた文字列でのみ使用できます。



10

これは文字列補間と呼ばれ、次のように行います。

"The #{animal} #{action} the #{second_animal}"

重要:文字列が二重引用符( "")内にある場合にのみ機能します。

期待どおりに機能しないコードの例:

'The #{animal} #{action} the #{second_animal}'

新しいプログラマーが学習できるように適切な用語を使用していただきありがとうございます:補間。
Mike Bethany

3

標準のERBテンプレートシステムがシナリオで機能する場合があります。

def merge_into_string(animal, second_animal, action)
  template = 'The <%=animal%> <%=action%> the <%=second_animal%>'
  ERB.new(template).result(binding)
end

merge_into_string('tiger', 'deer', 'eats')
=> "The tiger eats the deer"

merge_into_string('bird', 'worm', 'finds')
=> "The bird finds the worm"

0

次のように、ローカル変数で使用できます。

@animal = "Dog"
@action = "licks"
@second_animal = "Bird"

"The #{@animal} #{@action} the #{@second_animal}"

出力は次のようになります。「鳥をなめます」

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.