es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Localización de datos en memoria en Solidity

He estado siguiendo mi nuevo viaje en el aprendizaje de Solidity. Ahora estoy en un curso de structs + ubicaciones de datos, y llegué a una situación en la que no utilicé exactamente el mismo ejemplo que el instructor, ambos funcionan. Me gustaría saber cuál es técnicamente más correcto.

En cuanto a la forma en que lo hizo el instructor, entiendo que si esa variable de datos ya existe, llena de datos, y la estamos usando en un Almacenamiento, eso sería comprensible, pero para el caso de Memoria, aún no entiendo su significado.

Aquí están los dos ejemplos:

El mío:

struct PERSON {
uint256 id;
string name;
}

PERSON public personList;

function updateNewPerson(uint256 _index, string memory _name) public {
PERSON memory newUpdatedPerson;
newUpdatedPerson.name = _name;
personList[_index] = newUpdatedPerson;
}

Código del instructor:

struct PERSON {
uint256 id;
string name;
}

PERSON public personList;

function updateNewPerson(uint256 _index, string memory _name) public {
PERSON memory newUpdatedPerson = personList[index];
newUpdatedPerson.name = _name;
personList[_index] = newUpdatedPerson;
}

Este es el mismo ejemplo con la ubicación de datos Almacenamiento a la que me refiero:

function updateStoragePerson(uint256 _index, string memory _name) public {
PERSON storage newUpdatedPerson = personList[_index];
newUpdatedPerson.name = _name;
}

Estoy tratando de entender si hay alguna diferencia allí y creo que estoy empezando a entenderlo, por favor corríjame si estoy equivocado.

En mi ejemplo, básicamente estoy pasando el nuevo valor de inserción del usuario, que en este caso es _name, luego cuando lo devuelvo al array, se lo entrego a su posición a través del índice del array.

Cuando en el ejemplo del instructor, está pasando a través del contenido del caso de índice del array, que es id y name, luego inserta el nuevo valor de nombre desde la función antes de devolver los datos al array, y en este caso id y _name son idénticos.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Ambos ejemplos logran técnicamente el mismo resultado y son correctos. La diferencia radica en la forma en que se actualiza y se almacena en memoria los nuevos datos.

    En tu código, estás creando una nueva variable PERSON en memoria y asignándole el nuevo valor de nombre. Luego, estás reemplazando el valor existente de PERSON en el índice especificado en el array personList con el valor actualizado de PERSON.

    En el código del instructor, primero están recuperando el valor existente de PERSON en el índice especificado en el array personList y asignándolo a una nueva variable en memoria. Luego, están actualizando el nombre de la variable newUpdatedPerson con el nuevo valor de nombre pasado a la función. Finalmente, están reemplazando el valor existente de PERSON en el índice especificado en el array personList con la variable newUpdatedPerson actualizada.

    La diferencia en el código del instructor es que están actualizando los datos existentes en memoria en lugar de crear una nueva variable de datos. Esto puede ser útil en ciertas situaciones donde se desea modificar datos existentes o evitar el costo de crear una nueva variable.

    En el ejemplo con la ubicación de datos de almacenamiento (Storage), están actualizando directamente el valor existente de PERSON en el almacenamiento en lugar de crear una nueva variable en memoria primero. Esto reduce el costo de crear una nueva variable de datos en memoria y puede ser más eficiente.

    En resumen, los tres ejemplos logran el mismo resultado y son técnicamente correctos. La diferencia radica en la forma en que se actualizan y almacenan los nuevos datos en memoria o almacenamiento, lo cual puede afectar el rendimiento y la eficiencia en ciertas situaciones.

Comments are closed.