¿Cómo funciona la asignación a un mapeo?

Estoy tratando de entender cómo funcionan las asignaciones. Nunca antes había visto algo así, pero estoy seguro de que muchos idiomas usan algo similar. De todos modos, aquí está mi código:

ingrese la descripción de la imagen aquí

¿Qué estoy haciendo mal aquí?

¡Gracias!

Respuestas (3)

La razón de su error es porque en Solidez solo puede tener declaraciones fuera de las funciones.

En su código, declara el mapeo y luego, en otra operación, realiza una asignación que solo es posible en una función.

Para los otros tipos de datos, también es posible realizar la asignación durante la inicialización para que funcione.

Las asignaciones se pueden considerar como tablas hash, pero es diferente. En Solidity, una asignación se inicializa desde el principio con todas las claves posibles y el valor asociado de la clave es el predeterminado para el tipo especificado. Entonces, en Solidity, solo puede agregar nuevos valores a las claves y no puede agregar nuevas claves porque ya están allí.

También mencionar que, de forma predeterminada, no puede iterar sobre un mapeo en Solidity. De nuevo, eso está relacionado con lo que escribí antes. Además, no puede recuperar solo las claves para las que configuró algunos valores porque tiene todas las claves configuradas de forma predeterminada con valores.

Entonces, ¿no hay forma de sumar sobre un mapeo? Si quiero saber la suma, tengo que almacenarla en una variable adicional o usar una matriz en primer lugar.
Tu primera oración es irrelevante.
@AndiGiga @AndiGiga Eso es correcto. Las asignaciones simplemente transforman la clave en una estructura de tipo ValueType.
@JossieCalderon, ¿por qué mi primera oración es irrelevante?
@dragosb La respuesta es porque no se permite la asignación de variables declaradas fuera de las funciones. No porque solo puedas tener declaraciones fuera de las funciones, aunque eso también es cierto.

Las asignaciones son solo marginalmente como tablas hash y se implementan de forma totalmente diferente a cualquier otro lenguaje de programación. Por lo general, una tabla hash tendría una matriz interna que está llena en un 25-75 % de las claves/valores que ha almacenado. Y puede hacer cosas como iterar sobre ellos, ya que solo está saltando como máximo el 75% de las celdas vacías en una tabla no trivial. Maneras en que los mapeos de Solidity son diferentes:

  • En lugar de una pequeña tabla interna (generalmente a partir del tamaño 16) para almacenar pares clave/valor, el mapeo de Solidity utiliza todo el espacio de memoria direccionable de 256 bits. Por lo tanto, la iteración es computacionalmente inviable.
  • En lugar de apuntar a una lista vinculada de pares clave/valor, las asignaciones de Solidity no almacenan la clave en absoluto, no realizan ningún tipo de detección de colisión y no almacenan punteros a los valores, sino que almacenan el valor directamente. (Esta es la razón por la que no puede recuperar la llave y por la que no puede detectar si la llave se configuró o no).
  • En lugar de utilizar una función hash basada en Mersenne Prime rápida/insegura, utiliza SHA3 y no asigna la firma a un conjunto más pequeño. (Es por eso que no tiene que preocuparse por las colisiones).
  • Son O(1)operaciones verdaderas (desde el punto de vista del script), no O(1+e)como la mayoría de las otras tablas hash. No hay costos de crecimiento de cola larga, ya que la mesa nunca se expande, ni hay O(n)paseos en cadena de colisión.

Así que recomendaría NO pensar en ellos como tablas hash. En cambio, piense en ellos solo como funciones unidireccionales que devuelven un puntero a una dirección de memoria pseudoaleatoria.

Supuse que solo usaban una función hash perfecta . No es ese el caso?
@RichardHorrocks No. utiliza SHA3, que no es una función hash perfecta. las colisiones son posibles en SHA3 (incluso si nunca se ha demostrado ninguna), mientras que en una función hash perfecta no lo son. además, ninguna función hash que reduzca el espacio del mundo posible puede ser una función hash perfecta. (lo que hace SHA3, lo reduce de infinito a 2^256).
Aha - gracias por aclarar mi malentendido :-)
notario público. aunque desde una perspectiva del mundo real, funcionalmente tienes razón. como no existe una colisión conocida en SHA3, está bastante cerca de una función hash perfecta. pensar en ello como tal no es una mala heurística. :)

Para comprender las asignaciones, puede verlas como tablas hash .

Sobre tu código, probablemente alguien más pueda darte una explicación completa, pero creo que es porque tienes que asignar el valor al mapeo dentro de una función, por ejemplo:

contract Complex{
    uint a = 1;
    uint b = 3;
    mapping(uint => uint) myMap;

    function Complex(){
        myMap[a] = b;
    }
}

Este fragmento de código está haciendo lo mismo pero colocando el myMap[a] = b;interior del constructor.