设置默认YML值

时间:2012-08-28 16:04:12

标签: yaml

我有一个yaml文件,其中包含多个

形式的条目
item1:
  name: item1
  stem: item1

items2:
  name: item2
  stem: item2

有没有办法干掉它,因为每条记录的信息都遵循相同的形式?

我想以某种方式指明无论我使用该条目的名称,它还应该用于名称和词干。

我知道我可以使用&tag标记条目,并使用<<: *tag在其他条目中引用它们,但这是针对实际内容而不是表单。

1 个答案:

答案 0 :(得分:1)

YAML,据我所知,没有设置循环,并生成1.2规范的动态内容:http://www.yaml.org/spec/1.2/spec.html。它只是序列化数据的标准。但是,如果您的目标是在YAML文件中生成不重复的类似对象,则可以使用YAML的实现,并以编程语言(如Ruby)返回Array。

YAML的Ruby实现提供了“从Ruby中可用的任何类序列化对象的通用支持。”:http://www.yaml.org/YAML_for_ruby.html#objects这意味着您可以在Ruby中创建一个Array对象,其中包含您在YAML文件中重复的条目创建自定义类。

下面的示例类将在数组中生成x项,由YAML键items定义。

像这样构建YAML文件:

--- !ruby/object:Foo
  items: 2

注意:使用在http://www.yaml.org/YAML_for_ruby.html#objects定义的Object语法在第一个名称上指定要调用的类名

在Ruby中,定义您的类,并加载您的YAML文件以进行解析:

class Foo
  attr_accessor :items

  def initialize(items)
    @items = items
  end

  def generate
    x = 1
    result = []
    while x < @items do
      result.push({ "item#{x}" => {"name" => "item#{x}", "stem" => "item#{x}"} })
      x+=1
    end
    result
  end
end

foo = YAML.load_file('/path/to/yaml.yml') # => #<Foo:0xa1ff694 @items=2>

foo.generate # => [{"item1"=>{"name"=>"item1", "stem"=>"item1"}}, {"item2"=>{"name"=>"item2", "stem"=>"item2"}}]

在定义类Foo后加载YAML文件。 Foo在初始化时采用整数,这是我们在调用generate时将创建的项目数。 generate然后循环多次,并将一个新对象推送到一个数组,然后返回该数组。

在此示例中,您必须明确调用generate,因为您无法从initialize返回除self之外的任何内容。

我不确定这是否是您正在寻找的答案,但通过在自定义类中外包循环和创建对象,可能是保持YAML结构干燥的可能方法。

此方法也可以在其他语言中使用,具体取决于它们的YAML实现是否支持自定义序列化类。有关其他语言实现库,请参阅http://yaml.org/