11. Struct

Las estructuras son similares a las clases. Aquellos que ya han estudiado POO, saben de qué hablo. Usando Structs podemos crear un estándar de variables que serán usadas por el contrato inteligente.

# Declaración de la estructura

En este caso tenemos un struct llamado Usuario y este "objeto" usuario está compuesto por las siguientes variables: una dirección (tipo Address), un nombre (tipo String) y una puntuación (tipo uint).

struct Usuario {
  address direccion_wallet;
  uint puntaje;
  string nombre;
}

# Creación de instancias e inserción de datos

Para usar una estructura necesitamos instanciarla en otra variable y pasar los valores a las variables contenidas en la estructura cuando creamos la instancia. En el siguiente ejemplo, tenemos una función llamada foo y dentro de ella instanciamos la estructura de Usuario dentro de la variable usuario1 y usuario2 usando posiciones implícitas, que en este caso son el primer parámetro referente a la dirección, el segundo parámetro representando la puntuación y tercer parámetro que es el nombre.

El usuario3 fue instanciado usando datos explícitos. Pasamos los datos en formato de diccionario con clave y valor para indicar en qué variable (clave) se almacenará cada dato (valor).

# Leer, actualizar y eliminar datos

Para eliminar datos, es como cualquier otra variable. Simplemente coloque el nombre de la variable que tiene una estructura instanciada justo después de la palabra delete, como en el ejemplo a continuación.

Para leer y actualizar accedemos a los datos como parámetros de objeto, es decir, usando un punto: " . ", como en el ejemplo a continuación. Para acceder a la dirección almacenada en direccion_wallet que está dentro de la estructura de usuario instanciada en el variable usuario3, usamos la instrucción: usuario3.direccion_wallet.

function foo(string _nombre_, uint _puntaje) external {
  //Instanciando la estructura
  Usuario memory usuario1 = Usuario(msg.sender, _puntaje, _nombre);
  Usuario memory usuario2 = Usuario(otra_direccion, 10, _nombre);

  //Inserción explícita
  Usuario memory usuari3 = Usuario({
    nombre: _nombre,
    puntaje: _puntaje,
    direccion_wallet: msg.sender
    });

  usuario3.direccion_wallet; //Leyendo datos de un Struct
  usuario3.puntaje = 20; //Actualizando datos
  delete usuario3; //Borrando datos

# Lista de estructuras

Funciona de la misma manera que otra lista porque cuando creamos una instancia de una estructura dentro de una variable, estamos creando un tipo de dato y para insertarlo en un array, simplemente use el comando nombreArray.push(variable_instanciada).

Usuario[] users;

function foo(string calldata _nombre) external {
  //Instanciando la estructura
  Usuario usuario4 = Usuario(msg.sender, 0, _nombre);

  //Agregando usuario creado al Struct
  users.push(usuario4); 

  //Agregando directamente
  users.push(Usuario(msg.sender, 0, _nombre));

# Diccionario de Estructuras

En el siguiente ejemplo, instanciamos un usuario5 con la estructura que creamos anteriormente de tipo Usuario y luego almacenamos este usuario5 dentro de la clave msg.sender en un diccionario.

mapping(address => Usuario) listaDeUsuarios;

function foo2(string calldata _nombre) external {
  //Instanciando la estructura
  Usuario memory usuario5 = Usuario(msg.sender, 0, _nombre);

  //Agregando usuario creado a la lista de Structs
  listaDeUsuarios[msg.sender] = usuario5; 

  //Agregando directamente
  listaDeUsuarios[msg.sender] = Usuario(msg.sender, 0, _nombre);
Last Updated: 9/10/2022, 4:27:54