eval rubí ( '\ 1') de gsub posible?
Pregunta
trato de reemplazar un sub-str por el contenido de un valiable donde su nombre coincide con el sub-str por:
>> str = "Hello **name**"
=> "Hello **name**"
>> name = "John"
=> "John"
str.gsub(/\*\*(.*)\*\*/, eval('\1')) # => error!
la última línea en el código anterior es un error de sintaxis. y:
>> str.gsub(/\*\*(.*)\*\*/, '\1')
=> "Hello name"
>> str.gsub(/\*\*(.*)\*\*/, eval("name"))
=> "Hello John"
Lo que quiero es el resultado de:
str.gsub(/\*\*(.*)\*\*/, eval("name")) # => "Hello John"
cualquier ayuda será apreciada. THX!
Solución
Prueba esto:
str = "Hello **name**"
name = "John"
str.gsub(/\*\*(.*)\*\*/) { eval($1) }
El método gsub
también acepta un bloque, que será evaluado y el valor de retorno será utilizado como sustitución. Las variables $1
especial, $2
, y así sucesivamente, son idénticos a la utilización de \1
en una cadena.
A ligeramente mejor alternativa de utilizar eval()
sería utilizar un Hash
con los valores de reemplazo:
str = "Hello **name**"
names = { "name" => "John" }
str.gsub(/\*\*(.*)\*\*/) { names[$1] }
Otros consejos
Me di cuenta que no es la respuesta a su pregunta, pero ¿ha mirado líquido marcado ? Es esencialmente consigue el mismo efecto mediante el uso de dobles llaves {{}}
@template = Liquid::Template.parse("hi {{name}}") # Parses and compiles the template
@template.render( 'name' => 'tobi' ) # => "hi tobi"