Solidity
映射資料結構可以返回它指向的項目數嗎?
例如以下來自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].a
:index
是一個整數。在此範例中,它可以是 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
.
您無法獲取映射鍵的數量或獲取映射到數據的鍵列表。
當您將數據插入地圖時,您可以在單獨的數組中維護一個列表和一個鍵,然後您可以通過詢問索引的長度來間接獲取計數。
如果您使用事件發射器來報告狀態更改,您通常可以繼續這樣的想法,即合約本身不需要計數或列表,並且客戶端不需要合約的進一步幫助。