如果我尝试在我的YAML frontmatter中使用命令行胡子的ruby lambdas,则将其视为直文。
E.g。 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中的小胡子时相同的结果吗?
答案 0 :(得分:1)
我可以从命令行获得与使用IRB中的小胡子时相同的结果吗?
不,你不能。
你得到不同结果的原因是在IRB中你传递一个红宝石哈希对象,有两个键。密钥:wrapped
是proc
的实例。
在YAML,OTOH中,你有两个值为字符串。 YAML对存储对象的支持非常有限,我不知道有任何扩展允许proc
的序列化。天真的尝试不起作用:
{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>"
但我强烈建议不要这样做。