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!

¿Fue útil?

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"
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top