我有一个包含许多表单条目的 yaml 文件
item1:
name: item1
stem: item1
items2:
name: item2
stem: item2
由于每条记录的信息都遵循相同的形式,因此有没有办法将其干燥?
我想以某种方式指定无论我如何命名条目,它也应该用于名称和词干。
我知道我可以标记条目&tag
并在其他条目中引用它们,<<: *tag
但这是针对实际内容而不是表单。
我有一个包含许多表单条目的 yaml 文件
item1:
name: item1
stem: item1
items2:
name: item2
stem: item2
由于每条记录的信息都遵循相同的形式,因此有没有办法将其干燥?
我想以某种方式指定无论我如何命名条目,它也应该用于名称和词干。
我知道我可以标记条目&tag
并在其他条目中引用它们,<<: *tag
但这是针对实际内容而不是表单。
据我所知,YAML 没有用于循环和生成 1.2 规范的动态内容的设施:http ://www.yaml.org/spec/1.2/spec.html 。它只是一个序列化数据的标准。但是,如果您的目标是在 YAML 文件中生成不重复的类似对象,则可以使用 YAML 的实现,并以编程语言(例如 Ruby)返回一个数组。
YAML 的 Ruby 实现提供“对来自 Ruby 中可用的任何类的序列化对象的通用支持。”:http ://www.yaml.org/YAML_for_ruby.html#objects这意味着您可以在 Ruby 中创建一个包含您的条目的 Array 对象通过创建自定义类在 YAML 文件中重复。
下面的示例类将生成x
数组中的项目,如 YAML 键所定义items
。
像这样构造 YAML 文件:
--- !ruby/object:Foo
items: 2
注意:要调用的类名在名字上指定,使用在以下位置定义的 Object 语法:http ://www.yaml.org/YAML_for_ruby.html#objects
在 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"}}]
YAML 文件是在定义我们的类之后加载的Foo
。Foo
在初始化时接受一个整数,这是我们将在generate
调用时创建的项目数。generate
然后循环多次,并将新对象推送到数组,然后返回。
在此示例中,您必须显式调用generate
,因为您不能从initialize
.
我不确定这是否是您正在寻找的答案,但通过外包自定义类中对象的循环和创建,这可能是保持 YAML 结构干燥的一种方法。
这种方法也可以用于其他语言,具体取决于它们的 YAML 实现是否支持自定义序列化类。有关其他语言实现库,请参见http://yaml.org/ 。