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

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

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

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

Да, в самом деле. Спасибо Удалить тему?
Нет, удалять нужно только не по теме или непонятные вопросы. Дубликаты очень полезно хранить, так как есть несколько способов сформулировать вопрос.

Ответы (4)

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

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

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

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

Пример см. в разделе Как проверить, установлена ​​ли переменная состояния структуры .

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


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

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 { ... }
    }
}
Чтобы уточнить (поскольку это отличается от других языков, с которыми я работаю), я могу проверить structMapping[key].initalized == false, даже если этот ключ не был определен в сопоставлении?
Да, значение по умолчанию для всего в виртуальной машине Ethereum (на которой основана Solidity) равно нулю. (Все, что не инициализировано, равно нулю, в отличие от других языков, где значения могут быть «мусором».)
Можно ли использовать строку вместо bool? (говоря: у меня есть перечисление, для которого у меня есть только строковые свойства) Затем: с чем вы должны сравнивать строковую структуру? (другими словами: каково значение по умолчанию для строки)
@lajarre Хорошо, что вы спросили ethereum.stackexchange.com/questions/5683/…
Возможность проверить значение произвольных членов до того, как будет известно, инициализирована ли структура, также означает, что вам может даже не понадобиться знать ответ на этот вопрос — вы можете просто сразу приступить к назначению членов. Я знаю, я уже тоже чувствую пощечину segfault на своем лице, но Solidity — это зверь сам по себе.

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

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

function checkArray(bytes a) returns (bool){
    if ((a) && (a.length > 0))
        return true;
    return false;
}
Дайте мне ошибку: Operator && not compatible with types bytes memory and boolSolidity 0.4.7

Для беззнакового значения индекса массива структур (скажем, Customer) - чтобы проверить, существует ли запись в данном массиве структур, вы можете сделать что-то вроде ниже:

 struct Customer {
    string userName;
    string dataHash;
    address bank;
    int256 upVotes;
}

Customer[] public customers; 

...
//assuming we have some customers added (customers.length>0)
...

function getCustomerIndex(string memory userName) internal view returns(bool, uint256) {
    for(uint i=0; i<customers.length; i++) {
        if (stringEquals(customers[i].userName, userName)){
            return (true, i);
        }
    }
    return (false, 0);
}

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

Теперь в моем другом коде я могу использовать вышеуказанную функцию следующим образом:

// return 1 implies customer found and removed from struct Customer array
// return 0 implies no customer found in the struct Customer array
function removeCustomer(string calldata userName) external returns (uint8) {
        (bool result, uint256 index) = getCustomerIndex(userName);
        if (result){
            for (uint i=index+1; i<customers.length-1; i++){
                customers[i-1] = customers[i];
            }
            customers.length--;
            return 1;
        }
        return 0;
    }