在TON-Solidity智能合约中如何返回mapping类型数据?
TON-Solidity函数能否返回mapping类型?
不能,TON-Solidity不支持函数直接返回mapping类型。
原因说明
mapping是引用类型,在TON的TVM执行模型中,mapping仅存储键到值的索引映射,不会存储完整的键值对列表,函数返回时无法直接序列化全部内容传递给调用方,因此你写的示例语法本身就不被编译器支持。
替代实现方案
- 方案1:全量返回所有键值对
你可以额外维护一个存储所有已使用键的数组,需要返回全量数据时遍历数组取出所有对应值,组装为键数组+值数组的结构返回,示例代码如下:
注意:如果mapping数据量较大,全量返回可能会超出单次交易的gas限制,该方案仅适合数据量较小的场景struct SomeStruct { uint256 id; string info; } // 合约存储的目标mapping mapping(address => SomeStruct) private myMapping; // 额外维护的所有键列表 address[] private allMappingKeys; function func() public view returns (address[] memory keys, SomeStruct[] memory values) { uint256 count = allMappingKeys.length; keys = new address[](count); values = new SomeStruct[](count); for (uint256 i = 0; i < count; i++) { keys[i] = allMappingKeys[i]; values[i] = myMapping[allMappingKeys[i]]; } } - 方案2:单键查询
如果调用方不需要全量数据,仅需要查询指定键的值,可以直接实现接收键参数的查询函数,单次返回单个值:function getStructByAddress(address target) public view returns (SomeStruct memory) { return myMapping[target]; }
内容的提问来源于stack exchange,提问作者Nikolai Kushpela
相关产品推荐
相关产品推荐

