Solidity

映射資料結構可以返回它指向的項目數嗎?

  • November 6, 2021

例如以下來自https://ethereum.stackexchange.com/a/10763/4575的程式碼。我添加了新行,後面跟著//*.

pragma solidity ^0.4.2;
contract test {    
 struct my_struct {
   int a;
   int my_length; //*to keep track of the length.
 }

 mapping (address=>my_struct[]) Map;

 function fill_map(my_struct struct1,my_struct struct2) internal  {    
   Map[msg.sender].push(struct1);
   Map[msg.sender][0].my_length = Map[msg.sender][0].my_length + 1;//*

   Map[msg.sender].push(struct2);   
   Map[msg.sender][0].my_length = Map[msg.sender][0].my_length + 1;//*

   Map[msg.sender].push(struct3);//*  
   Map[msg.sender][0].my_length = Map[msg.sender][0].my_length + 1;//*

   delete Map[id][2]; //*struct3 will be removed.
   Map[msg.sender][0].my_length = Map[msg.sender][0].my_length - 1;//*
 }
}

我可以獲得如下數據Map[id][index].aindex是一個整數。在此範例中,它可以是 0(對於 struct1)或 1(對於 struct2)。

正如我們所知,Java 可以返回列表中對象的數量:

String[] array = new String[10];
int size = array.length;

有沒有類似的東西:Map[id].length?或在每個之後手動push還是delete我需要保持長度?

在我的解決方案中Map[msg.sender][0].my_length,將返回指向結構的數量Map[msg.sender]

您以前的程式碼中有一些錯誤(或者我不太理解您的問題),我認為您的問題也是如此。

在您的情況下,您有一個數組映射。所以Map[key].length存在並將相應數組的大小返回給您的鍵。所以Map[msg.sender].length是正確的,但Map[msg.sender][0].length不是。因為在第二種情況下,您將返回第一個沒有長度參數但有my_length.

您無法獲取映射鍵的數量或獲取映射到數據的鍵列表。

當您將數據插入地圖時,您可以在單獨的數組中維護一個列表和一個鍵,然後您可以通過詢問索引的長度來間接獲取計數。

如果您使用事件發射器來報告狀態更改,您通常可以繼續這樣的想法,即合約本身不需要計數或列表,並且客戶端不需要合約的進一步幫助。

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