Solidity
如何在映射的介面中聲明 getter 函式簽名?
我有一個
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]; } }