Solidity

如何為結構數組編寫 getter 函式?“儲存參考儲存引用不能隱式轉換為預期類型 uint256'

  • July 14, 2022

我正在開發一個允許使用者互相下注的應用程序。為了獲得一些有用的 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和 an event 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];
   }

}

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