在命令行上允许带小胡子的lambdas?

时间:2018-06-06 04:37:46

标签: ruby mustache

如果我尝试在我的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中的小胡子时相同的结果吗?

1 个答案:

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

但我强烈建议不要这样做。