如何向parents列表添加空Parent实例?遇UnimplementedFeatureError报错
解决Solidity中
UnimplementedFeatureError:动态数组从memory复制到storage的问题 这个错误其实是Solidity当前的特性限制导致的——你试图用memory中的动态数组去初始化storage结构体里的动态数组,而当前Solidity版本还不支持这种直接的跨内存区域复制操作。
问题根源
你的代码里parents.push(Parent(new Child[](0)))这一行,new Child[](0)创建的是一个memory类型的空数组,而Parent结构体里的children是storage类型的动态数组。Solidity不允许直接把memory的动态数组赋值给storage的动态数组,尤其是在结构体初始化的场景下,这就触发了那个未实现特性的错误。
解决方法
其实你完全不需要显式创建那个memory数组!因为当你初始化Parent结构体时,它的children动态数组默认就是空的。直接用下面两种方式之一即可解决问题:
方法1:直接push默认的Parent实例
contract Test { struct Child { } struct Parent { Child[] children; } Parent[] parents; function test() public { // 直接push,Solidity会自动初始化children为空的storage数组 parents.push(); } }
方法2:显式使用结构体默认初始化语法
contract Test { struct Child { } struct Parent { Child[] children; } Parent[] parents; function test() public { // 用{}显式初始化结构体,children会默认是空数组 parents.push(Parent({})); } }
扩展:给children添加元素
之后如果要给某个Parent的children数组添加元素,直接操作storage里的数组即可,完全没问题:
function addChildToParent(uint parentIndex) public { // 直接向storage中的children数组push新元素 parents[parentIndex].children.push(Child({})); }
内容的提问来源于stack exchange,提问作者Jonas H.
相关产品推荐
相关产品推荐

