在命令行上允许带有小胡子的 lambda 表达式?

Allow lambdas with mustache on command line?

如果我尝试在带有命令行胡须的 YAML frontmatter 中使用 ruby lambda,它会被视为纯文本。

例如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 的 mustache 相同的结果吗?

Can I get the same result from the command line as when I use mustache from IRB?

不,你不能。

你得到不同结果的原因是在 IRB 中你传递了 a ruby hash object,有两个键。键 :wrapped proc 的实例。

在 YAML 和 OTOH 中,您有两个值 作为字符串 。 YAML 对存储对象的支持非常有限,我不知道有任何扩展允许序列化 procs。天真的尝试不起作用:

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

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