Разрешить лямбды с усами в командной строке? - PullRequest
0 голосов
/ 06 июня 2018

Если я попытаюсь использовать рубиновые лямбды в моем фронт-матерте YAML с усами командной строки, это будет выглядеть так, как если бы это был прямой текст.

Например, test.yaml:

name: Willy  
wrapped: proc { |text| "<b>#{text}</b>" }

template.mustache:

{{#wrapped}}
{{name}} is awesome.
{{/wrapped}}

Результат в командной строке:

$ mustache test.yaml template.mustache  
Willy is awesome.

С другой стороны, в IRB:

irb(main):032:0> Mustache.render("{{#wrapped}}{{name}} is awesome.  
{{/wrapped}}", name: "Willy", wrapped: proc {|text| "<b>#{text}</b>"  
})

=> "<b>Willy is awesome.</b>"

Могу ли я получить тот же результатиз командной строки, когда я использую усы из IRB?

1 Ответ

0 голосов
/ 06 июня 2018

Можно ли получить тот же результат из командной строки, что и при использовании усов из IRB?

Нет, вы не можете.

Причина, по которой вы получаете разные результатыв том, что в IRB вы передаете рубиновый хеш-объект , имеющий два ключа.Ключ :wrapped является экземпляром proc.

В YAML, OTOH, у вас есть оба значения в виде строк .YAML имеет очень ограниченную поддержку хранения объектов, и я не знаю ни одного расширения, позволяющего сериализацию proc s.Наивная попытка не работает:

{wrapped: proc { |text| "<b>#{text}</b>" }}.to_yaml
#⇒ "---\n:wrapped: !ruby/object:Proc {}\n"

Очевидно, что при загрузке обратно, это станет NOOP.Вы можете взломать это поведение с помощью чего-то вроде:

YAML.load_file('/path/to/your/file.yaml').
  map { |k, v| [k, v.start_with?('proc') ? eval(v) : v] }.
  to_h[:wrapped].('Hi!')
#⇒ "<b>Hi!</b>"

Но я настоятельно рекомендую этого не делать.

...