Solidity
如何為結構數組編寫 getter 函式?“儲存參考儲存引用不能隱式轉換為預期類型 uint256'
我正在開發一個允許使用者互相下注的應用程序。為了獲得一些有用的 Web-UI 資訊,我需要為結構數組編寫一個 getter 函式。
我的程式碼的簡化版本可以理解這一點:
struct UserStruct { uint256 betAmount; uint256 matchId;} mapping(address => UserStruct[]) public userStructs; function appendUserBet( uint256 eventNumber) public payable{ UserStruct memory userStruct = UserStruct(msg.value, eventNumber); userStructs[msg.sender].push(userStruct);} function userStructLookUp(uint eventNumber, address userId) public view returns (UserStruct memory){ uint index = userStructs[userId].length; for (uint i = 0; i < index; i++) { if (userStructs[userId][i].matchId == eventNumber) { return userStructs[userId][i];}}}
我
userStructs
有兩個鍵 - anaddress
和 anevent id
,我目前版本的 getter 函式可以使用它們,因為我為它提供了所需的參數。我需要的是一個函式,當我為該函式提供使用者地址時,該函式將為我提供特定使用者的結構數組。所以我想它會是這樣的:
function userMatchesLookUp(address userId ) public view returns(uint256[] memory){ return userStructs[userId];}
但它沒有編譯,因為我嘗試將返回分配給錯誤的類型
storage ref[] storage ref is not implicitly convertible to expected type uint256[]
,但哪個是正確的?在這裡問了一個類似的問題$$ Similar question $$但沒有解決問題的辦法。你能告訴我哪裡出錯了嗎?先感謝您!
您的問題是您正在
userMatchesLookUp()
函式內部檢索一個 uint256 數組,並且您正在返回整個結構數組。我建議您返回整個結構數組,因為通過這種方式您可以檢索其中的所有值,例如:每個匹配的 betAmount 和 matchId。我以這種方式調整了你的智能合約:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract Test { struct UserStruct { uint256 betAmount; uint256 matchId; } mapping(address => UserStruct[]) public userStructs; function appendUserBet( uint256 eventNumber) public payable{ UserStruct memory userStruct = UserStruct(msg.value, eventNumber); userStructs[msg.sender].push(userStruct); } function userStructLookUp(uint eventNumber, address userId) public view returns (UserStruct memory){ uint index = userStructs[userId].length; for (uint i = 0; i < index; i++) { if (userStructs[userId][i].matchId == eventNumber) { return userStructs[userId][i]; } } } // NOTE: I changed your return object with struct array in signature function function userMatchesLookUp(address userId) public view returns(UserStruct[] memory){ return userStructs[userId]; } }