Solidity

為什麼在映射中依賴於參數的查找後,array.length 給出的“長度”未找到或不可見?

  • September 10, 2021

這是我定義結構數組的方式:

 struct FoodItem {
    string name;
    uint price;
    bool available;
 }

 mapping(uint => FoodItem) public foods;

現在我想從這個數組中刪除一個元素。另外,我暫時不需要維持秩序。為此,我做了:

function deleteItem(uint index) public onlyOwner {
   require(index < foods.length);
   foods[index] = foods[foods.length-1];
   foods.length--;
   emit deletedItem(index, foods.length);
}

但這給了我一個錯誤:

TypeError: Member "length" not found or not visible after argument-dependent lookup in mapping(uint256 => struct FoodOrder.FoodItem storage ref).
   require(index < foods.length);
                   ^----------^

我正在使用solidity 0.5.16這個。

那不是數組。那是一個映射。

映射不能被迭代並且它們是無序的——因此它們也沒有長度。事實上,沒有辦法知道映射有多少條目,除非您將該資訊儲存在其他地方(或通過查看交易從區塊鏈外部計算它)。

要從映射中刪除條目,您可以簡單地delete foods[id];. 請注意,idhere不是索引,而是uint您定義為映射中的鍵的索引。

引用自:https://ethereum.stackexchange.com/questions/109654