Если у меня есть сопоставление строки => пользовательская структура, как мне проверить, определено ли значение в сопоставлении?
В документах говорится, что «каждый возможный ключ существует и сопоставляется со значением, байтовое представление которого состоит из нулей».
Каково нулевое значение пользовательской структуры, существование которой можно условно проверить?
Вы проверяете, определено ли значение в отображении, проверяя, что оно не равно нулю.
Если явное значение нуля имеет значение для вашего приложения, вам потребуются вспомогательные данные (или структура), чтобы отслеживать, когда значение нуля было явно установлено.
Облегченным подходом было бы добавить 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 { ... }
}
}
На самом деле нет такого понятия, как «пустой». Неинициализированный индекс отображения просто равен "нулевому" значению соответствующего типа.
Чтобы проверить, было ли присвоено значение, просто проверьте, если 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 bool
Solidity 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;
}
начало эфира
Джей Би