Solidity
在 Solidity 中返回結構和列表
Solidity 阻止您返回結構、列表和其他資料結構是否有特殊原因?我知道它需要是安全的,並且允許數組/列表訪問可能會弄亂數據,但為什麼連結構都不能呢?我正在嘗試制定一份契約,該契約從事故記錄的區塊鏈中返回一個特定車牌(這是結構中的欄位之一)發生的事故列表,但我只設法得到它返回一條記錄,這也是它的各個欄位。這對我來說似乎效率很低..
請注意,我首先嘗試返回字元串
$$ $$但必須將其更改為字節$$ $$因為 Solidity 也不允許這樣做。
/* To get a list of incidents from a startID */ function listIncidents(uint _startID, uint _count) constant returns(uint[10] _incIDs, bytes[10] _names, bytes[10] _descriptions, bytes[10] _places, bytes[10] _times, bytes[10] _dates) { uint maxIters = _count; if((_startID + _count) > getIncidentCount()) { maxIters = getIncidentCount() - _startID; } _incIDs = new uint[](maxIters); _names = new bytes[](maxIters); _descriptions = new bytes[](maxIters); _places = new bytes[](maxIters); _times = new bytes[](maxIters); _dates = new bytes[](maxIters); for(uint i=0;i<maxIters;i++) { uint _incidentID = _startID + i; PoliceRecord memory r = incidents[_incidentID]; _incIDs[i] = _incidentID; _names[i] = bytes(r.incName); _descriptions[i] = bytes(r.incDescription); _places[i] = bytes(r.incPlace); _times[i] = bytes(r.incTime); _dates[i] = bytes(r.incDate); } }
您可以返回數組。你不能做的是返回數組的數組,包括
string[]
orbytes[]
(因為string
orbytes
已經是一個數組)。原因只是 ABI(應用程序二進制介面)的限制。當您嘗試執行此操作時,您應該會看到來自編譯器的警告:
此類型僅在新的實驗性 ABI 編碼器中受支持。使用“pragma Experimental ABIEncoderV2;” 啟用該功能。
如果您可以將字元串長度限制為 32,則可以
bytes32
改用。此程式碼工作正常:pragma 穩固性 ^0.4.24;
contract Test { function test() public pure returns (bytes32[]) { bytes32[] memory foo = new bytes32[](2); foo[0] = "hello"; foo[1] = "goodbye"; return foo; } }