将struct memory []内存复制到尚不支持的存储

Jon*_* H. 5 solidity smartcontracts

如何在下面的代码示例中将新的空Parent实例添加到父项列表中?我一直在

UnimplementedFeatureError: Copying of type struct Test.Child memory[] memory
to storage not yet supported.
Run Code Online (Sandbox Code Playgroud)

最小的例子:

contract Test {
  struct Child { } 
  struct Parent { Child[] children; }

  Parent[] parents;

  function test() {
    parents.push(Parent(new Child[](0)));
  }
}
Run Code Online (Sandbox Code Playgroud)

Ada*_*nis 9

你不能真正做你想用动态数组做的事情.您需要稍微改变一下方法才能使其正常工作.

contract Test {
  struct Child { } 
  struct Parent { 
      mapping(uint => Child) children;
      uint childrenSize;
  }

  Parent[] parents;

  function testWithEmptyChildren() public {
      parents.push(Parent({childrenSize: 0}));
  }

  function testWithChild(uint index) public {
      Parent storage p = parents[index];

      p.children[p.childrenSize] = Child();
      p.childrenSize++;
  }
}
Run Code Online (Sandbox Code Playgroud)

使用Parent.childrenSize,如果你需要通过迭代Parent.children在合同中其他地方.

或者,您可以增加parents数组的大小并使用Solidity的默认零值.

contract Test {
  struct Child { } 
  struct Parent { Child[] children; }

  Parent[] parents;

  function test() public {
      parents.length++;
      Parent storage p = parents[parents.length - 1];

      Child memory c;

      p.children.push(c);
  }
}
Run Code Online (Sandbox Code Playgroud)