Cómo incluir una matriz (de una estructura) en una estructura en Solidity
Recientemente comencé a aprender Solidity y he visto dos videos de conferencias al respecto y he leído la documentación oficial, pero no logro encontrar una solución para esto. [También he revisado varios recursos en busca de ayuda pero no he encontrado ninguno]
Necesidad: Dos structs
donde uno haga referencia al otro (el Reader
struct tiene un Book
struct books), y cuando se crea un reader
, books
está vacío hasta que recojan (función pickUp
) un libro. [He creado una lista constante de libros disponibles].
Lo que he intentado:
pragma solidity ^0.6.0
contract School {
struct Book {
string name;
}
Book[2] public books = [Book("we1"), Book("uer")];
struct Reader {
string name;
uint booksRead; //por cada libro agregado, esto se incrementa
Book[] books;
}
Reader public readers;
function _createReader(string memory _name) public returns (uint) {
//alguna lógica
readers.push(Reader("Freddie", 0, books[0]));
uint256 readerID = readers.length - 1;
return readerID;
}
}
Error (no se compila): TypeError: Tipo no válido para el argumento en la llamada a la función. Conversión implícita no válida desde struct School.Book storage ref a struct School.Book memory[] memory solicitado.
No logro entender este error.
Resultado esperado:
Reader 1 (al crearse): “Fred”, 0, [] //nombre Fred, booksRead 0, lista vacía de libros
Reader 1 (al actualizarse): “Fred”, 2, [Book(“SomeBookI”), (“SomeBookII”)]
davy.ai
Para arreglar el error, necesitamos hacer algunos cambios en el código.
Primero, en la función
_createReader
, debemos inicializar el arraybooks
para la nueva instancia deReader
como un array vacío, de la siguiente manera:Esto crea una nueva instancia de
Reader
con un arraybooks
vacío.A continuación, necesitamos modificar la función
pickUp
para permitir que un lector recoja un libro. Esta función debe tomar elreaderID
y elbookIndex
(el índice del libro que desean recoger en el arraybooks
), y luego agregar el libro al arraybooks
de la instancia deReader
.Aquí está el código actualizado:
Ahora, podemos llamar a la función
_createReader
para crear una nueva instancia deReader
, y utilizar la funciónpickUp
para agregar libros a su arraybooks
. Aquí hay un ejemplo:Esto debería crear una nueva instancia de
Reader
llamada “Fred”, con un arraybooks
vacío. Luego, utilizamos la funciónpickUp
para agregar dos libros a su arraybooks
. Por último, verificamos que el estado de la instancia deReader
se haya actualizado correctamente.