Skip to content

Latest commit

 

History

History
158 lines (113 loc) · 4.3 KB

12映射.md

File metadata and controls

158 lines (113 loc) · 4.3 KB

映射

使用语法 mapping(keyType => valueType) 创建映射。

keyType 可以是任何内置值类型、字节数组、字符串或任何合约。

valueType 可以是任何类型,包括另一个映射或数组。

映射不可迭代。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract Mapping {
    // 地址到整数的映射
    mapping(address => uint) public myMap;

    scss
    Copy code
    function get(address _addr) public view returns (uint) {
        // 映射始终返回一个值。
        // 如果该值从未设置过,它将返回默认值。
        return myMap[_addr];
    }

    function set(address _addr, uint _i) public {
        // 更新此地址的值
        myMap[_addr] = _i;
    }

    function remove(address _addr) public {
        // 将该值重置为默认值。
        delete myMap[_addr];
    }
    }

    contract NestedMapping {
    // 嵌套映射(从地址到另一个映射)
    mapping(address => mapping(uint => bool)) public nested;

    scss
    Copy code
    function get(address _addr1, uint _i) public view returns (bool) {
        // 即使未初始化,也可以从嵌套映射中获取值
        return nested[_addr1][_i];
    }

    function set(address _addr1, uint _i, bool _boo) public {
        nested[_addr1][_i] = _boo;
    }

    function remove(address _addr1, uint _i) public {
        delete nested[_addr1][_i];
    }
}

代码术语解释:

映射是 Solidity 中一种数据结构,用于将一个类型的值映射到另一个类型的值。
keyType 可以是任何内置值类型、字节数组、字符串或任何合约,valueType 可以是任何类型,包括另一个映射或数组。
映射是非迭代的,不能像数组一样通过下标访问所有元素。
通过在映射中使用 delete 可以将值重置为默认值。默认值取决于 valueType 的类型,通常为 0 或 false。
嵌套映射是将映射嵌套在另一个映射中的方式。可以使用嵌套映射来实现多维映射。

https://solidity-by-example.org/mapping/

扩充

Solidity中的映射(Mapping)支持以下类型

可以作为键类型(keyType):

  • 值类型(Value Types):布尔(bool)、整型(int/uint)、地址(address)、字节(byte)
  • 引用类型(Reference Types):字符串(string)、定长字节数组(bytes1到bytes32)
  • 枚举类型(Enums)
  • 其他映射(Mappings)是不允许的。映射本身不能作为键。

映射的值类型(valueType)可以是任意类型,包括:

  • 值类型:布尔、整型、地址、字节等
  • 引用类型:字符串、字节数组、数组、结构体等
  • 映射类型
  • 枚举类型
  • 其他合约类型
  • 接口类型

同时注意:

映射本身不能作为键类型,但可以作为值类型

例如:

// 字符串作为键
mapping (string => uint) public balances; 

// 字节数组作为键 
mapping (bytes32 => address) public usernames;

// 枚举类型作为键
enum Status {Active, Inactive}
mapping (Status => uint) public statusCounts;

同样 Mapping也可以使用嵌套方式

mapping (key1 => mapping (key2 => value2)) public nested;

这里key1key2都是键类型,value2是值类型。

这样我们就可以通过nested[key1][key2]的方式访问最内层的映射值。

contract NestedMapping {
    
    mapping(address => mapping(uint => bool)) public nested;
    //将地址和另一个Mapping进行匹配

    function get(address _addr1, uint _i) public view returns (bool) {
        // 可以从嵌套映射中获取值
        // 即使未初始化
        return nested[_addr1][_i];
    }

    function set(address _addr1, uint _i, bool _boo) public {
        nested[_addr1][_i] = _boo;
    }

    function remove(address _addr1, uint _i) public {
        delete nested[_addr1][_i];
    }
}

例如:

mapping (address => mapping (uint => bool)) public nested;

function set(address _addr, uint _id, bool _boo) public {
  nested[_addr][_id] = _boo;
}

function get(address _addr, uint _id) public view returns (bool) {
  return nested[_addr][_id]; 
}
//这里我们把地址映射到另一个从uint到bool的映射。
//set函数可以设置内层映射的值,get函数可以读取内层映射的值。
//这样的嵌套映射结构可以用来存储更复杂的数据,如用户地址到该用户的多个状态ID。