3

YAML :: Nodeオブジェクトのすべての値のコピーを新しいオブジェクト(つまりクローン)に取得する方法はありますか?また、ノード内の値によって2つのYAML :: Nodeオブジェクト間の同等性をテストする方法はありますか(つまり、.is()関数ではなく.equals()関数)?

次の例を考えてみましょう。

YAML::Node a;
a["x"][1]["y"][2]["z"][3] = 1;
std::cout << "A_____\n" << a << "\n\n\n\n";

std::cout << "Test 1\n";
YAML::Node z = a["x"][1]["y"][2]["z"];
z[3] = 2;
std::cout << "Z_____\n" <<  z << "\n";
std::cout << "A_____\n" <<  a << "\n\n\n\n";

std::cout << "Test 2\n";
YAML::Node b = a;
b["x"][1]["y"][2]["z"][3] = 3;
std::cout << "B_____\n" <<  b << "\n";
std::cout << "Z_____\n" <<  z << "\n";
std::cout << "A_____\n" <<  a << "\n\n\n\n";

std::cout << "Test 3\n";
YAML::Node c;
c["x"][1]["y"][2]["z"][3] = 3;
std::cout << "C_____\n" <<  c << "\n";
std::cout << "A_____\n" <<  a << "\n";
std::cout << "a == c: " <<  bool(a==c) << "\n";
std::cout << "z == a[\"x\"][1][\"y\"][2][\"z\"]: "
            <<  bool(z == a["x"][1]["y"][2]["z"]) << "\n\n";

実行時に以下を出力します。

A_____
x:
  1:
    y:
      2:
        z:
          3: 1



Test 1
Z_____
3: 2
A_____
x:
  1:
    y:
      2:
        z:
          3: 2



Test 2
B_____
x:
  1:
    y:
      2:
        z:
          3: 3
Z_____
3: 3
A_____
x:
  1:
    y:
      2:
        z:
          3: 3



Test 3
C_____
x:
  1:
    y:
      2:
        z:
          3: 3
A_____
x:
  1:
    y:
      2:
        z:
          3: 3
a == c: 0
z == a["x"][1]["y"][2]["z"]: 1

テスト1では、変更zによっての値も変更されます。a["x"][1]["y"][2]["z"]同様に、テスト2では、変更bは変更と同じaです。これらのコピーセマンティクスはAPIの一部と見なされますか(つまり、将来変更される可能性があります)?、などのコードを記述z = getZ()してgetZ()戻り値を付けたいa["x"][1]["y"][2]["z"](「x」、「y」、「z」の名前は将来変更される可能性があります)。変更zすると、例に示すように変更aされます。

また、変更しても変更されないように、のクローンをa新しいオブジェクトに取り込む方法はありますか?bba

test3では、の値はの値cと同じaです。a.equals(c)YAML :: Nodeオブジェクトに対して、2つのノードの値がすべて同じであるかどうかをテストするための一般的な方法はありますか?例でa.equals(c)は、trueになります。

4

1 に答える 1

1

ノードをディープコピーするには:

YAML::Node node = /* ... */;
YAML::Node other = Clone(node);

(これは現在実装されています。古いバグレポートを見ることができます。)

現在の動作は意図されたものであり(つまり、一般的な「コピー」はIDを設定するだけです)、変更されません。

平等に関しては、それは一般的にYAMLにとって非常に難しい問題です。yaml-cppプロジェクトページでこの問題に関するいくつかの議論があります。

于 2012-06-21T01:11:26.853 に答える