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**
}
}
下面是本次实验所配套的视频教程:
