Wenn ich eine Zuordnung von string => benutzerdefinierte Struktur habe, wie überprüfe ich, ob ein Wert in der Zuordnung definiert ist?
Die Dokumente besagen, dass "jeder mögliche Schlüssel existiert und einem Wert zugeordnet ist, dessen Byte-Darstellung alle Nullen sind".
Was ist der Nullwert einer benutzerdefinierten Struktur, so dass man bedingt auf ihre Existenz prüfen kann?
Sie überprüfen, ob ein Wert im Mapping definiert ist, indem Sie überprüfen, ob er nicht Null ist.
Wenn ein explizites Setzen von Null für Ihre Anwendung von Bedeutung ist, benötigen Sie Hilfsdaten (oder Strukturen), um nachzuverfolgen, wann ein Wert von Null explizit gesetzt wurde.
Ein leichter Ansatz wäre bool
, der Struktur eine Eigenschaft hinzuzufügen (z. B. mit dem Namen initialized
) und sie auf festzulegen, true
wenn die Null explizit festgelegt wird. Da alle bools standardmäßig falsch (0) sind, können Sie mit dem Wert prüfen true
.
Überprüfen Sie alternativ, ob jedes Mitglied der Struktur null ist. Wenn ein Mitglied a ist string
, wandeln Sie es um bytes
und prüfen Sie dann, ob seine Länge Null ist .
Ein Beispiel finden Sie unter Testen, ob eine Strukturstatusvariable festgelegt ist
Je nach Anwendung kann eine andere Datenstruktur oder Zuordnung erforderlich sein.
Hier ist ein verwandtes Beispiel für die Verwendung eines Paares, um die Bedeutung von Null zu überprüfen :
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 { ... }
}
}
„Leer“ gibt es eigentlich nicht. Ein nicht initialisierter Index der Zuordnung ist einfach gleich dem "Null"-Wert des richtigen Typs.
Um zu prüfen, ob ein Wert zugewiesen wurde, prüfen Sie einfach, ob balances[msg.sender]== 0
. Wenn ein Benutzer auf den Vertrag zugreift, der Saldo jedoch 0 sein sollte, können Sie eine Adresse => int256-Zuordnung verwenden und -1 für Salden von 0 verwenden
function checkArray(bytes a) returns (bool){
if ((a) && (a.length > 0))
return true;
return false;
}
Operator && not compatible with types bytes memory and bool
solidity 0.4.7Für einen vorzeichenlosen Indexwert eines Arrays von Strukturen (z. B. Kunde) können Sie Folgendes tun, um zu überprüfen, ob der Eintrag in einem bestimmten Array von Strukturen vorhanden ist:
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);
}
Das explizite (false, 0) deutet darauf hin, dass der Kunde mit dem angegebenen Benutzernamen nicht im Strukturarray des Kunden gefunden wird.
Jetzt kann ich in meinem anderen Code die obige Funktion wie folgt verwenden:
// 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;
}
Anfängerether
JB