Как удалить элемент из сопоставления?

У меня есть такое отображение:

struct data {  
   string name;  
   string nickname;  
}

mapping(address => data) public user;

Как правильно удалить один элемент из переменной user? Мне нужно только позвонитьdelete(user[address])

или же

мне также нужно удалить user[address].nameи user[address].nickname?

Ответы (1)

Да, delete user[someAddress];будет работать со структурами, не содержащими отображения.

Для этого вопроса, поскольку nameи nicknameне являются сопоставлениями, они будут автоматически удалены (установлены на ноль): нет необходимости делать что-то вроде «удалить пользователя [someAddress].name».

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

если вы удалите структуру, она сбросит все элементы, которые не являются сопоставлениями, а также рекурсивно перейдет к членам, если они не являются сопоставлениями.

Предостережение:

удаление не влияет на целые сопоставления (поскольку ключи сопоставлений могут быть произвольными и, как правило, неизвестными)

Что произойдет с данными в user[someaddres].name и user[someaddress].nickname из приведенного выше примера, когда я удалю user[someAddress]? Будут ли они также удалены или мне придется удалить их, прежде чем я удалю пользователя [someAddress]?
Спасибо за комментарий, я добавил к ответу, чтобы сделать его более понятным.
Означает ли это, что «удаление» не освобождает место для хранения, удаление и обнуление — это две разные вещи, не так ли?
@Jaime «удалить» в смарт-контракте просто устанавливает нулевые значения. Восстановление дискового пространства является деталью реализации и зависит от узла: он может увидеть ноль и выполнить «обрезку», а может и нет.
Удаление элементов из массива и его реорганизация для устранения дыр действительно экономит газ в виде возврата газа (сумма вычитается из вашей стоимости газа). Нет ли чего-то подобного с отображениями?
@Qwerty Возвраты были уменьшены в EIP-3529 .