Ruby 允许在命令行上使用带有胡子的lambda?
如果我尝试在YAML frontmatter中使用ruby lambdas和命令行小胡子,它将被视为纯文本 例如,test.yaml: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
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的序列化。naive尝试不起作用:
{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>"