I want to create a Pokémon structure with an array of structs inside.
// 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));
}
}
But I am getting the following error:
UnimplementedFeatureError: Copying of type struct PokemonFactory.Ability memory[] memory to storage not yet supported.
I adjusted your original smart contract in this way:
// 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;
}
}
I inserted some comments for understand you each statement
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With