Solidity

如何在映射的介面中聲明 getter 函式簽名?

  • January 8, 2022

我有一個contract實現 的interface,契約有一個狀態變數mapping(address => bytes32[]) public usersLists,我在這個狀態變數中定義了一個 getter 函式簽名interface,但是我收到以下編譯器錯誤:

TypeError: Data location must be "memory" or "calldata" for return parameter in function, but none was given.
 --> interfaces/IPool.sol:42:65:
  |
42 |   function usersLists(address user) external view returns (bytes32[]);
  |                                                                 ^^^^^^^^^

介面和合約如下:

interface IA {
 function usersLists(address user) external view returns (bytes32[]);
}

contract A is IA {
 mapping(address => bytes32[]) public override usersLists;
}

有人可以幫我解決這個問題嗎?這似乎是一個問題,list而不是bytes32刪除[]使其成為一個mapping(address => bytes32)刪除編譯器錯誤,但從這個答案應該可以返回bytes32[]

對於動態類型,您需要定義儲存位置。

在你的情況下function usersLists(address user) external view returns (bytes32[] memory);

在 Solidity 文件中查看更多資訊:https ://docs.soliditylang.org/en/v0.8.10/types.html#data-location

編輯:

您連結的問題使用了較舊的 Solidity 版本,因此在那裡不需要。

編輯2:

介面中的方法與自動生成的getter不對應mapping(address => bytes32[])。Solidity 會自動將所有“key-lookups”作為參數添加到 getter 函式中。

這是一個範例,其中預設 getter 將返回 a bytes32,而自定義 getter 返回整個數組:

interface IA {
 // Getter that will be generated automatically
 function usersLists(address user, uint256 index) external view returns (bytes32);
 // Custom getter
 function getUsersLists(address user) external view returns (bytes32[] memory);
}

contract A is IA {
 mapping(address => bytes32[]) public override usersLists;

 function getUsersLists(address user) external override view returns (bytes32[] memory) {
       return usersLists[user];
 }
}

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