Wie lösche ich ein Element aus einem Mapping?

Ich habe eine Zuordnung wie folgt:

struct data {  
   string name;  
   string nickname;  
}

mapping(address => data) public user;

Was ist der richtige Weg, um ein Element aus der Variable user zu löschen? Muss ich nur anrufendelete(user[address])

oder

muss ich auch löschen user[address].nameund user[address].nickname?

Antworten (1)

Ja, delete user[someAddress];funktioniert mit Strukturen, die keine Zuordnung enthalten.

Da nameund nicknamekeine Zuordnungen sind, werden sie für diese Frage automatisch gelöscht (auf Null gesetzt): Es ist nicht erforderlich, etwas wie "delete user[someAddress].name" zu tun.

http://solidity.readthedocs.io/en/develop/types.html#delete

Wenn Sie eine Struktur löschen, werden alle Elemente zurückgesetzt, die keine Zuordnungen sind, und auch in die Elemente rekursiv, es sei denn, es handelt sich um Zuordnungen

Vorbehalt:

delete hat keine Auswirkung auf ganze Zuordnungen (da die Schlüssel von Zuordnungen beliebig sein können und im Allgemeinen unbekannt sind)

Was passiert mit den Daten in user[someaddress].name und user[someaddress].nickname des obigen Beispiels, wenn ich user[someaddress] lösche? Werden sie auch gelöscht oder muss ich sie löschen, bevor ich user[someAddress] lösche?
Danke für den Kommentar, ich habe die Antwort hinzugefügt, um es klarer zu machen.
Bedeutet das, dass "Löschen" keinen Speicherplatz freigibt, löschen und auf Null setzen sind zwei verschiedene Dinge, oder?
@Jaime "Löschen" in einem Smart Contract setzt nur Werte auf Null. Das Wiederherstellen von Speicherplatz ist ein Implementierungsdetail und hängt vom Knoten ab: Er sieht möglicherweise eine Null und führt eine "Pruning" durch, aber möglicherweise nicht.
Das Löschen von Elementen aus einem Array und das Neuanordnen, um Löcher zu eliminieren, spart Gas in Form einer Gasrückerstattung (ein Betrag wird von Ihren Gaskosten abgezogen). Gibt es nicht etwas ähnliches mit Mappings?
@Qwerty Rückerstattungen wurden in EIP-3529 reduziert .