2

サブ文字列を、その名前がサブ文字列と一致する変数の内容で置き換えようとします。

>> str = "Hello **name**"
=> "Hello **name**"
>> name = "John"
=> "John"

str.gsub(/\*\*(.*)\*\*/, eval('\1')) # => error!

上記のコードの最後の行は構文エラーです。と:

>> str.gsub(/\*\*(.*)\*\*/, '\1')
=> "Hello name"
>> str.gsub(/\*\*(.*)\*\*/, eval("name"))
=> "Hello John"

私が欲しいのは次の結果です:

str.gsub(/\*\*(.*)\*\*/, eval("name")) # => "Hello John"

どんな助けでも大歓迎です。どうも!

4

2 に答える 2

7

これを試して:

str = "Hello **name**"
name = "John"
str.gsub(/\*\*(.*)\*\*/) { eval($1) }

このgsubメソッドはブロックも受け入れます。これは評価され、戻り値が置換として使用されます。$1、などの特殊変数は、文字列での$2使用と同じです。\1

を使用するよりもわずかに優れた代替手段は、置換値でeval()a を使用することです。Hash

str = "Hello **name**"
names = { "name" => "John" }
str.gsub(/\*\*(.*)\*\*/) { names[$1] }
于 2010-03-29T08:31:33.953 に答える
1

これがあなたの質問に対する答えではないことは承知していますが、Liquid マークアップを見ましたか? 二重中括弧 {{}} を使用して、基本的に同じことを実現します。

@template = Liquid::Template.parse("hi {{name}}") # Parses and compiles the template
@template.render( 'name' => 'tobi' )              # => "hi tobi"
于 2011-03-03T20:29:44.317 に答える