возможно ruby ​​eval ('\ 1') из gsub? - PullRequest
2 голосов
/ 29 марта 2010

Я пытаюсь заменить подстроку содержимым валидного, если его имя соответствует подстроке:

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

любая помощь будет оценена. ТНХ!

Ответы [ 2 ]

7 голосов
/ 29 марта 2010

Попробуйте это:

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] }
1 голос
/ 03 марта 2011

Я понимаю, что это не ответ на ваш вопрос, но вы смотрели на Жидкая разметка ? По сути, это достигается тем же путем использования двойных скобок {{}}

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