【问题标题】:Can one YAML object refer to another?一个 YAML 对象可以引用另一个吗?
【发布时间】:2011-03-09 15:49:02
【问题描述】:

我想让一个 yaml 对象引用另一个,如下所示:

intro: "Hello, dear user."

registration: $intro Thanks for registering!

new_message: $intro You have a new message!

上述语法只是它可能如何工作的一个示例(这也是它在this cpan module 中的工作方式。)

我正在使用标准的 ruby​​ yaml 解析器。

这可能吗?

【问题讨论】:

标签: ruby yaml


【解决方案1】:

一些 yaml 对象确实引用了其他对象:

irb> require 'yaml'
#=> true
irb> str = "hello"
#=> "hello"
irb> hash = { :a => str, :b => str }
#=> {:a=>"hello", :b=>"hello"}
irb> puts YAML.dump(hash)
---
:a: hello
:b: hello
#=> nil
irb> puts YAML.dump([str,str])
---
- hello
- hello
#=> nil
irb> puts YAML.dump([hash,hash])
---
- &id001
  :a: hello
  :b: hello
- *id001
#=> nil

请注意,它并不总是重用对象(字符串只是重复),但有时会(散列定义一次并通过引用重用)。

YAML 不支持字符串插值——这似乎是你想要做的——但你没有理由不能更详细地对其进行编码:

intro: Hello, dear user
registration: 
- "%s Thanks for registering!"
- intro
new_message: 
- "%s You have a new message!"
- intro

然后您可以在加载 YAML 后对其进行插值:

strings = YAML::load(yaml_str)
interpolated = {}
strings.each do |key,val|
  if val.kind_of? Array
    fmt, *args = *val
    val = fmt % args.map { |arg| strings[arg] }
  end
  interpolated[key] = val
end

这将为interpolated 产生以下结果:

{
  "intro"=>"Hello, dear user", 
  "registration"=>"Hello, dear user Thanks for registering!", 
  "new_message"=>"Hello, dear user You have a new message!"
}

【讨论】:

  • 有趣。两个问题:[1]所以dump不只是返回一个字符串,而是在执行环境中寻找变量? [2] 我不确定我是否理解 hash 案中发生的事情。
  • @John:[1] 转储不查看变量 - 但它确实在传递的对象中寻找重复。 [2] 在YAML.dump([hash,hash]) 中,它有一个符号到字符串的哈希数组。在检查数组时,它发现两个哈希值指向同一个对象。因此,第一次打印哈希时,它为该哈希提供了一个标识符 (&id001),而第二次,它没有再次打印整个内容,而是引用了该标识符 (*id001)。
  • 我明白了。所以这并没有真正让我在寻求重用 yaml 文件中的对象的任何地方,对吧?
  • @John:我想我不明白您所说的“在 yaml 文件中重用对象”是什么意思。 YAML.dump([hash,hash]) 生成一个 yaml 字符串,可以将其写入文件。在该字符串中,对象被重用。
  • 查看我在原始问题中的示例——我希望在摄取文件时将“$intro”替换为“intro”字符串。
【解决方案2】:

与其尝试在您的 yaml 中使用隐式引用,不如使用替换字符串(如上所示,但您需要引号)并在解析时显式替换它们的内容?

【讨论】:

  • 从这个意义上说,我想我的问题是“标准的 Ruby YAML 解析器是否已经明确支持这一点?”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多