#{variable}参照を含む文字列をロードしました。文字列内のこれらの変数をどのように解決puts
しますか?
name="jim"
str="Hi #{name}"
puts str
putsの代わりに、結果をパラメーターとして渡したり、変数に保存したりできるようにしたいと思います。
#{variable}参照を含む文字列をロードしました。文字列内のこれらの変数をどのように解決puts
しますか?
name="jim"
str="Hi #{name}"
puts str
putsの代わりに、結果をパラメーターとして渡したり、変数に保存したりできるようにしたいと思います。
文字列には、として表示されるフォーマットオプションがあります%
。補間と同じように、事前定義された文字列に引数を渡すために使用できます。
message = "Hello, %s"
for_patrick = message % "Patrick" #=> "Hello, Patrick"
for_jessie = message % "Jessie" #=> "Hello, Jessie"
messages = "Hello, %s and %s"
for_p_and_j = messages % ["Patrick", "Jessie"] #=> "Hello, Patrick and Jessie"
「ルビーっぽい」とは思えないかもしれませんが、お探しの機能だと思います。
したがって、これらのプレースホルダーを含む文字列がどこかから入ってくる場合は、次のように引数として値を渡すことができます。
method_that_gets_hello_message % "Patrick"
これにより、期待する値のみを受け入れることもできます。
message = "I can count to %d"
message % "eleven" #=> ArgumentError: invalid value for Integer()
ウィキペディアには、Rubyでも機能する可能性のあるプレースホルダーのリストがあります。printf()
puts
変数を解決しません。Rubyパーサーは、文字列を作成するときに実行します。他のメソッドに渡しstr
た場合、補間はすでに行われているため、「Hijim」を渡すのと同じになります。
あなたはそれを評価することができます
name = "Patrick"
s = 'hello, #{name}'
s # => "hello, \#{name}"
# wrap the string in double quotes, making it a valid interpolatable ruby string
eval "\"#{s}\"" # => "hello, Patrick"
この特定のタスクeval
の唯一の解決策のようです。しかし、タスクを少し変更すれば、この汚い、安全でない、不名誉なことを避けることができます。ローカルではなく、インスタンス変数を使用せずに解決できます。 eval
eval
instance_variable_get
@name = "Patrick"
@id = 2 # Test that number is ok
@a_b = "oooo" # Test that our regex can eat underscores
s = 'hello, #{name} !!#{id} ??#{a_b}'
s.gsub(/#\{(\w+)\}/) { instance_variable_get '@'+$1 }
=> "hello, Patrick !!2 ??oooo"
この場合、正規表現を少し変更するだけで、代わりに他の文字を使用することもできます#{}
(たとえばなど)。%name%
しかしもちろん、これはすべてにおいがします。
テンプレートシステムの基礎が必要なようですが、Stringgsub
またはsub
メソッドを使用するとRubyが簡単に実行できます。
replacements = { '%greeting%' => 'Hello', '%name%' => 'Jim' }
pattern = Regexp.union(replacements.keys)
'%greeting% %name%!'.gsub(pattern, replacements)
=> "Hello Jim!"
キーは次のように簡単に定義できます。
replacements = { '#{name}' => 'Jim' }
Rubyの通常の文字列補間を使用します#{...}
が、それを再利用しないことをお勧めします。代わりに、ユニークなものを使用してください。
これの利点は、ターゲット=>置換マップをYAMLファイルまたはデータベーステーブルに簡単に配置できることです。その後、それらを他の言語または別のユーザー情報と交換できます。空が限界です。
これの利点は、評価が含まれず、文字列の置換のみであるということです。少しクリエイティブに使用することで、実際にマクロを実装できます。
macros = { '%salutation%' => '%greeting% %name%' }
replacements = { '%greeting%' => 'Hello', '%name%' => 'Jim' }
macro_pattern, replacement_pattern = [macros, replacements].map{ |h| Regexp.union(h.keys) }
'%salutation%!'.gsub(macro_pattern, macros).gsub(replacement_pattern, replacements)
=> "Hello Jim!"