将数组推入结构体 - 将类型为struct memory[] memory的内存复制到存储器中尚不受支持

3
我想创建一个带有结构体数组的 Pokémon 结构。
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract PokemonFactory {

  struct Pokemon {
    uint256 id;
    string name;
    Ability[] abilities;
  }

  struct Ability {
    string name;
    string description;
  }

  Pokemon[] public pokemons;

  function createPokemon(string memory _name, string memory _abilityNme, string memory _abilityDscription) public {
    uint id = pokemons.length;
    pokemons[id].abilities.push(Ability(_abilityNme, _abilityDscription));
    pokemons.push(Pokemon(id, _name, pokemons[id].abilities));
  }
}

但我遇到了以下错误:

UnimplementedFeatureError: Copying of type struct PokemonFactory.Ability memory[] memory to storage not yet supported.
1个回答

5

我按照以下方式调整了您原始的智能合约:

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

contract PokemonFactory {

  struct Pokemon {
    uint256 id;
    string name;
    Ability[] abilities;
  }

  struct Ability {
    string name;
    string description;
  }

  Pokemon[] public pokemons;

  function createPokemon(string memory _name, string memory _abilityNme, string memory _abilityDscription) public {
    uint id = pokemons.length;
    // NOTE: First I create an 'empty' space in pokemons mapping
    Pokemon storage p = pokemons.push();
    // NOTE: Then after I created this space, I insert the values 
    p.abilities.push(Ability(_abilityNme, _abilityDscription));
    p.id = id;
    p.name = _name;
  }
  
  // NOTE: Function for retrieve Abilities array values for a single pokemon using '_id' parameters for querying the mapping
  function retrieveAbilities(uint _id) external view returns(Ability[] memory){
    return pokemons[_id].abilities;
  }
}

我为每个语句添加了一些注释,以便您理解


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接