Ruby 允许在命令行上使用带有胡子的lambda?

Ruby 允许在命令行上使用带有胡子的lambda?,ruby,mustache,Ruby,Mustache,如果我尝试在YAML frontmatter中使用ruby lambdas和命令行小胡子,它将被视为纯文本 例如,test.yaml: name: Willy wrapped: proc { |text| "<b>#{text}</b>" } 命令行上的结果: $ mustache test.yaml template.mustache Willy is awesome. 另一方面,在内部评级法中: irb(main):032:0> Mustache.r

如果我尝试在YAML frontmatter中使用ruby lambdas和命令行小胡子,它将被视为纯文本

例如,test.yaml:

name: Willy  
wrapped: proc { |text| "<b>#{text}</b>" }
命令行上的结果:

$ mustache test.yaml template.mustache  
Willy is awesome.
另一方面,在内部评级法中:

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(main):032:0>Mustache.render({{{wrapped}}{{{name}}}太棒了。
{{/wrapped}},名称:“Willy”,wrapped:proc{{text}“{text}”
})
=>“威利太棒了。”
我可以从命令行获得与从IRB使用mustache时相同的结果吗

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

不,你不能

得到不同结果的原因是在IRB中传递了一个ruby哈希对象,该对象有两个键。键
:wrapped
proc
的一个实例

在YAML、OTOH中,两个值都是字符串。YAML对存储对象的支持非常有限,我不知道有任何扩展允许
proc
s的序列化。nai’ve尝试不起作用:

{wrapped: proc { |text| "<b>#{text}</b>" }}.to_yaml
#⇒ "---\n:wrapped: !ruby/object:Proc {}\n"
{wrapped:proc{text}“{text}}}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.load_文件('/path/to/your/file.YAML')。
映射{| k,v |[k,v.start_with?('proc')?eval(v):v]}。
到_h[:wrapped]。('Hi!')
#⇒ “嗨!”
但是我强烈建议不要这样做。

虽然这是正确的(尽管我在一些内部库中使用了第二个实现,在这些库中我完全控制了yml文件)。关于如何在rubinius中实现这一点,这本书读起来很有趣。
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>"