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

问题描述 投票:0回答:1

如果我尝试在我的YAML frontmatter中使用命令行小胡子的ruby lambdas,则将其视为直文。

例如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中的胡子时相同的结果吗?

ruby mustache
1个回答
1
投票

我可以从命令行获得与使用IRB中的胡子时相同的结果吗?

你不能。

你得到不同结果的原因是在IRB中你传递一个ruby哈希对象,有两个键。关键的:wrappedproc的一个例子。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.