0

フォームのエントリが多数含まれているyamlファイルがあります

item1:
  name: item1
  stem: item1

items2:
  name: item2
  stem: item2

各レコードの情報は同じ形式に従うので、これを乾かす方法はありますか?

エントリの名前をどのように作成しても、名前と語幹にも使用する必要があることを、なんとかして指定したいと思います。

&tagエントリにタグを付け、他のエントリでそれらを参照できることは知っています<<: *tagが、これは実際のコンテンツであり、フォームではありません。

4

1 に答える 1

1

私の知る限り、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/を参照してください。

于 2012-08-28T18:42:02.347 に答える