在命令行上允许带有小胡子的 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 对存储对象的支持非常有限,我不知道有任何扩展允许序列化 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>"
但我强烈建议不要那样做。
如果我尝试在带有命令行胡须的 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 对存储对象的支持非常有限,我不知道有任何扩展允许序列化 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>"
但我强烈建议不要那样做。