gsub的ruby eval('\ 1')可能吗?

ohh*_*hho 2 ruby eval gsub

我尝试用一​​个valiable的内容替换一个sub-str,其名称与sub-str匹配:

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

str.gsub(/\*\*(.*)\*\*/, eval('\1')) # => error!
Run Code Online (Sandbox Code Playgroud)

上面代码中的最后一行是语法错误.和:

>> str.gsub(/\*\*(.*)\*\*/, '\1')
=> "Hello name"
>> str.gsub(/\*\*(.*)\*\*/, eval("name"))
=> "Hello John"
Run Code Online (Sandbox Code Playgroud)

我想要的是:

str.gsub(/\*\*(.*)\*\*/, eval("name")) # => "Hello John"
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.谢谢!

mol*_*olf 7

试试这个:

str = "Hello **name**"
name = "John"
str.gsub(/\*\*(.*)\*\*/) { eval($1) }
Run Code Online (Sandbox Code Playgroud)

gsub方法还接受一个块,该块将被评估,返回值将用作替换.特殊变量$1,$2等,等同于使用\1中的字符串.

比使用更好的替代方法eval()是使用Hash具有替换值的a:

str = "Hello **name**"
names = { "name" => "John" }
str.gsub(/\*\*(.*)\*\*/) { names[$1] }
Run Code Online (Sandbox Code Playgroud)