mapping映射是一种特殊的一对一“函数”。它是一种键值对的关系。即键是唯一的,键所对应的值是可变的。一个键必须对应一个值,这就构成了一对。不同的键,就是不同的键值对。键值对的存在,完美的为“所属关系”的代码逻辑提供了施展的空间。

实验目的

1. 掌握映射的键值对关系以及映射的增删改查。

2. 明白嵌套映射的键值对关系以及映射的增删改查。

3. 了解mapping的应用场景。

实验要求

1. 查看示例1的第一个合约Mapping,按照注释要求补充好三个方法体,补充完整后操作以下步骤,检查代码逻辑是否正确。

①调用set函数,传入账户一的地址作为myMap映射的键与数字10作为myMap映射的值。

②调用get函数,传入账户一的地址,查看返回值是否为10。

③调用remove函数,传入账户一的地址。然后再操作第2个步骤,查看账户返回的值是否为0,如果为0证明删除成功。

2. 查看示例1中的第二个合约NestedMapping,根据第一个合约的注释要求依次补充好代码,补充完整后操作以下步骤,检查代码逻辑是否正确。

①调用set函数,传入账户一的地址作为nested映射的键与数字10作为nested映射的值,再传入true作为数字10所对应的值。

②调用get函数,传入账户一的地址与其所对应的数字10,查看返回值是否为数字10所对应的true。

③调用remove函数,传入账户一的地址与其所对应的数字10。然后再操作第2个步骤,查看账户返回的值是否为默认值false,如果为false证明删除成功。

查看示例2,该合约的目的是设计一个账户产品注册系统。主要功能是,账户地址编译部署该合约,调用register函数,传入他的产品名字进行注册。每次注册后,产品总数sum都会进行加一操作,每个产品的顺序号sum都会对应该产品名存入映射namemapping里。可以通过函数getNameById查看产品序号对应的产品名。请你按该逻辑补充好示例2。思考还有什么样的场景可以用到mapping映射。

以下是本次实验所使用到的测试代码,请使用remix编辑器完成该实验

示例1:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Mapping {
mapping(address => uint) private myMap;
//1.请你补充函数set,使得映射myMap的键为输入的_addr,值为输入的_i。
    function set(address _addr, uint _i) public {
        
}
//2.请你补充函数get,使得函数返回输入地址_addr所对应的值。
    function get(address _addr) public view returns (uint) {
        
}
//3.请你补充函数remove,使得函数自定义删除已存在的键值对。
    function remove(address _addr) public {
        
    }
}
 
contract NestedMapping {
    //请你根据上面合约Mapping的注释要求,补充下面的mapping嵌套。
    mapping(address => mapping(uint => bool)) private nested;
    function set(address _addr1,uint _i,bool _boo) public {
        //**1**
    }
    function get(address _addr1, uint _i) public view returns (bool) {
        //**2**
    }
    function remove(address _addr1, uint _i) public {
        //**3**
    }
}
示例2:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
 //请按要求3补充好代码
contract Reg {
   mapping(uint => string) namemapping;
   uint public sum = 0;
   function register(string memory name)public{
      //**1**
   } 
   function getNameById(uint id)public view returns(string memory){
       //**2**
   }
}

下面是本次实验所配套的视频教程: