Что такое нулевое значение для строки?

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

Согласно документам, это означает проверку того, что элемент отображения имеет 0-значение, что мне неясно, когда речь идет о строках.

contract C {
    mapping (address => string) m1;
    mapping (address => StringStruct) m2;

    struct StringStruct {
        string someString; // Always defined when initialising this struct
        // There could be other string properties here...
    }
    
    function amIInBothMappings() returns (bool) {
         // Check that both m1[msg.sender] and m2[msg.sender].someString are non-0
    }
}

В примере: как лучше всего реализовать amIInBothMappingsпроверку, которая msg.senderне инициализирована в обоих сопоставлениях m1 и m2?

Похоже, что сравнение строк все еще выполняется вручную: forum.ethereum.org/discussion/3238/string-compare-in-solidity . Сравните первую строку со строковым атрибутом в структуре. Нулевая строка — это просто '' .

Ответы (2)

Один из способов — проверить длину строки:

if (bytes(m1[msg.sender]).length != 0 && bytes(m2[msg.sender].someString).length != 0)
    // do your thing

Смотрите ответ, который я разместил здесь

действительно, трюк с bytes().length работает хорошо!

Другой способ - сравнить хэши sha3 строк

if (sha3(myVariable) != sha3("")) {
 // is not empty string
}

Однако этот метод, вероятно, менее эффективен.