Supongamos una struct Node
y una matriz de nodos allNodes[]
. Tuve éxito al agregar Node
a la matriz, pero cuando traté de usar un removeNode()
método (que usa el delete
método en matrices), el valor de allNodes.length
sigue siendo el mismo. ¿Es porque las cadenas de bloques son "inmutables"? ¿No significa inmutable que cuando se realiza una transacción (incluso remove Node()
), no se puede deshacer?
Es posible, pero no hace exactamente lo que (probablemente) esperas.
Señala "no hay datos importantes aquí" y ayuda a mantener las cosas eficientes en el nivel de la plataforma, pero no reorganiza la matriz en el nivel de la aplicación, lo que significa que no cambia todos los elementos por encima de la fila eliminada una fila hacia abajo. La longitud no cambia.
La inmutabilidad tiene un impacto aquí. No importa lo que hagamos, solo estamos agregando al estado anterior. Nada se elimina realmente. Incluso las transacciones que crearon, actualizaron y finalmente eliminaron la "fila" son parte del historial inmutable. "Eliminar" no puede tratarse de borrar datos, pero podría tratarse de reorganizarlos.
Eche un vistazo aquí: ¿Existen patrones de almacenamiento sencillos y bien resueltos para Solidity?
"Estructuras asignadas con índice habilitado para eliminar" realiza una eliminación lógica. Es apropiado para situaciones en las que se eliminará un alto porcentaje de filas y desea evitar repetir la basura.
El mucho más simple "Mapeo con Struct" es más común. Establece un "bit" para indicar una eliminación lógica.
Espero eso ayude.
allNodes.length
variable? Me gusta allNodes.length ++
o allNodes.length --
...
Richard Horrocks
yobro97
delete
el método. El problema aquí es que si muevo manualmente miNodes
, la próxima vez que intente agregar un elemento usando elpush
método, habrá algún conflicto... porque el último elemento permanece sin cambios en el método manual.Rob Hitchens