Что такое нулевое, пустое или нулевое значение структуры?

Если у меня есть отображение строки => custom defined struct, как проверить, определено ли значение в сопоставлении?

В документах указано, что «все возможные ключи существуют и сопоставлены с значением, байт-представление которого является всеми нулями».

Каково нулевое значение настраиваемой определенной структуры, чтобы можно было условно проверить ее существование?

28 голосов | спросил Thomas Clowes 2 FebruaryEurope/MoscowbTue, 02 Feb 2016 20:35:07 +0300000000pmTue, 02 Feb 2016 20:35:07 +030016 2016, 20:35:07

3 ответа


23

Вы проверяете, что значение определено в сопоставлении, проверяя, что оно не равно нулю.

Если явный параметр нуля имеет смысл для вашего приложения, вам нужны вспомогательные данные (или структура) для отслеживания, когда явно установлено значение нуля.

Легким подходом было бы добавить свойство bool в структуру (например, с именем initialized)) и установить его в true, когда нуль явно задан. Поскольку по умолчанию все значения bools ложны (0), вы можете проверить значение true.

В качестве альтернативы, убедитесь, что каждый член структуры равен нулю. Если элемент является строкой string, переведите его в bytes, а затем проверить, что его длина равна нулю .

В качестве примера см. Как проверить, установлена ​​ли переменная состояния struct

В зависимости от приложения может потребоваться другая структура данных или сопоставление.


Вот связанный пример использования пары для проверки значения нуля :

contract C {
    uint[] counters;
    function getCounter(uint index)
        returns (uint counter, bool error) {
            if (index >= counters.length) return (0, true);
            else return (counters[index], false);
        }
    function checkCounter(uint index) {
        var (counter, error) = getCounter(index);
        if (error) { ... }
        else { ... }
    }
}
ответил eth 2 FebruaryEurope/MoscowbTue, 02 Feb 2016 22:22:40 +0300000000pmTue, 02 Feb 2016 22:22:40 +030016 2016, 22:22:40
5

Нет такой вещи, как «пустой». Неинициализированный индекс отображения просто равен «нулевому» значению соответствующего типа.

Чтобы проверить, было ли задано значение, просто проверьте, балансирует ли balances[msg.sender]== 0. Если пользователь обращается к контракту, но баланс должен быть равен 0, вы можете использовать адрес => int256 и использовать -1 для 0 балансов

ответил Tjaden Hess 5 FebruaryEurope/MoscowbFri, 05 Feb 2016 20:53:41 +0300000000pmFri, 05 Feb 2016 20:53:41 +030016 2016, 20:53:41
1
function checkArray(bytes a) returns (bool){
    if ((a) && (a.length > 0))
        return true;
    return false;
}
ответил Augusto Federico Lemble 17 MarpmThu, 17 Mar 2016 23:54:18 +03002016-03-17T23:54:18+03:0011 2016, 23:54:18

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132