Solidity中是否支持在函数内部声明mapping变量?
Solidity 函数内部是否支持声明mapping类型变量
支持,但存在严格的使用限制,不能随意声明任意存储位置的mapping变量,具体规则如下:
- mapping是Solidity专为链上持久化存储设计的引用类型,底层采用存储槽哈希寻址的结构实现,仅能在
storage存储位置存在,不支持分配在memory(内存)、calldata(调用数据)这类临时数据空间中。 - 函数内部声明的mapping变量必须显式指定
storage存储位置,且这类变量本质是对合约已声明的状态变量中mapping的引用,无法在函数内凭空初始化一个全新的独立mapping——storage空间的分配仅能在合约状态变量定义阶段完成,函数内的storage变量必须指向已经存在的状态存储位置。
正确用法示例
contract MappingDemo { // 合约状态层声明的mapping,预先分配持久化存储槽 mapping(address => uint) public userScores; function updateScore() external { // 函数内声明storage类型mapping,作为已有状态mapping的引用 mapping(address => uint) storage scoreRef = userScores; // 操作引用变量等价于直接操作原状态mapping scoreRef[msg.sender] = 90; } }
非法写法示例
以下代码无法通过编译,编译器会直接抛出类型错误:
contract BadMapping { function wrongDeclare() external pure { // 错误1:尝试声明memory位置的mapping mapping(address => uint) memory tempMap; // 错误2:尝试声明calldata位置的mapping // mapping(address => uint) calldata callMap; } }
补充说明:即便是嵌套mapping、mapping作为结构体成员的场景,上述规则依然成立,所有非状态变量位置的mapping声明都只能是storage引用,无法创建临时的mapping实例。
内容的提问来源于stack exchange,提问作者Thomas Giang
相关产品推荐
相关产品推荐

