0

#{variable}参照を含む文字列をロードしました。文字列内のこれらの変数をどのように解決putsしますか?

name="jim"
str="Hi #{name}"
puts str        

putsの代わりに、結果をパラメーターとして渡したり、変数に保存したりできるようにしたいと思います。

4

5 に答える 5

1

文字列には、として表示されるフォーマットオプションがあります%。補間と同じように、事前定義された文字列に引数を渡すために使用できます。

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()

于 2013-01-28T18:04:09.137 に答える
1

puts変数を解決しません。Rubyパーサーは、文字列を作成するときに実行します。他のメソッドに渡しstrた場合、補間はすでに行われているため、「Hijim」を渡すのと同じになります。

于 2013-01-28T16:49:24.237 に答える
1

あなたはそれを評価することができます

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"
于 2013-01-28T16:49:49.340 に答える
0

この特定のタスクevalの唯一の解決策のようです。しかし、タスクを少し変更すれば、この汚い、安全でない、不名誉なことを避けることができます。ローカルではなく、インスタンス変数を使用せずに解決できます。 evalevalinstance_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%

しかしもちろん、これはすべてにおいがします。

于 2013-01-28T17:49:16.703 に答える
0

テンプレートシステムの基礎が必要なようですが、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!"
于 2013-01-28T18:35:57.860 に答える