¿Cuál es el valor cero para una cadena?

¿Cómo verificar que una cadena, o una estructura con solo propiedades de cadena, se inicialice o no, dentro de un mapeo?

De acuerdo con los documentos, significa verificar que el elemento de la asignación esté en su valor 0, lo que no me queda claro cuando se habla de cadenas.

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
    }
}

En el ejemplo: ¿cuál es la mejor manera de implementar amIInBothMappingsque las comprobaciones msg.senderno estén inicializadas en las asignaciones m1 y m2?

Parece que la comparación de cadenas sigue siendo manual: forum.ethereum.org/discussion/3238/string-compare-in-solidity . Compare la primera cadena con el atributo de cadena en la estructura. La cadena cero es simplemente '' .

Respuestas (2)

Una forma es comprobar la longitud de una cadena:

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

Mira la respuesta que publiqué aquí.

de hecho, el truco bytes().length parece funcionar bien.

Otra forma es comparar los hashes sha3 de las cadenas.

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

Sin embargo, este método es probablemente menos eficiente.