私の知る限り、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カスタム クラスを作成して、YAML ファイルで繰り返します。
以下のこのサンプル クラスはx
、YAML キーで定義されているように、配列内に項目を生成しますitems
。
YAML ファイルを次のように構成します。
--- !ruby/object:Foo
items: 2
注: 呼び出すクラス名は、 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"}}]
Foo
クラスが定義された後、YAML ファイルがロードされます。Foo
初期化時に整数を取ります。これは、generate
呼び出されたときに作成するアイテムの数です。generate
次に、これを何度もループし、新しいオブジェクトを配列にプッシュして、それを返します。
generate
この例では、 self 以外のものを返すことができないため、明示的に呼び出す必要がありますinitialize
。
これがあなたが求めている答えかどうかはわかりませんが、カスタム クラスでのオブジェクトのループと作成をアウトソーシングすることで、YAML 構造を DRY に保つ方法の可能性があります。
このアプローチは、YAML 実装がカスタムのシリアル化クラスをサポートしているかどうかに応じて、他の言語でも使用できます。追加の言語実装ライブラリについては、http: //yaml.org/を参照してください。