2010-03-29 45 views
2

我試圖通過一個valiable其中它的名字由副STR相匹配的內容替換子STR:gsub的ruby eval(' 1')可能嗎?

>> 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" 

任何幫助將不勝感激。謝謝!

+0

不知道我完全理解你的問題在這裏..你能否澄清。你想用「Hello John」代替「Hello ** name **」? – 2010-03-29 08:19:37

回答

7

嘗試這種情況:

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

gsub方法還接受塊,這將進行評估,並返回值將被用作替換。特殊變量$1,$2等等與在字符串中使用\1相同。

比使用eval()稍微更好的選擇是使用一個Hash與替換值:

str = "Hello **name**" 
names = { "name" => "John" } 
str.gsub(/\*\*(.*)\*\*/) { names[$1] } 
+0

謝謝!哈希方式令人鼓舞。 – ohho 2010-03-29 08:36:51

1

我意識到這是不回答你的問題,但你看Liquid markup?它基本上通過使用雙括號來完成同樣的事情{{}}

@template = Liquid::Template.parse("hi {{name}}") # Parses and compiles the template 
@template.render('name' => 'tobi')    # => "hi tobi"