Solidity新手求助:解析`MappingExample m = new MappingExample();`语句含义
问题解答:Solidity中
new MappingExample()语句与合约部署的困惑 1. 理清代码结构逻辑
你看到的官方文档代码应该包含两个独立合约:
- 第一部分
contract MappingExample { ... }是定义mapping的基础合约,里面包含mapping变量和操作它的函数。 - 第二部分是另一个合约,其中
MappingExample m = new MappingExample();的含义是:在当前合约内部,创建一个MappingExample合约的新实例。这里的m是「合约类型变量」,和你定义uint x作为整数变量的逻辑类似,m用来存储新创建的MappingExample合约实例的引用。
2. 为什么部署后和第二部分无关?
在Remix中部署合约时,你需要手动选择要部署的目标合约:
- 如果部署的是
MappingExample,那只会运行这个合约的逻辑,第二部分的代码属于另一个独立合约,自然不会被执行。 - 如果部署的是第二部分的合约,它才会在部署过程中自动创建
MappingExample的实例,并通过m变量操作这个实例。
举个补全后的代码示例,方便理解:
// 基础合约:定义mapping和操作函数 contract MappingExample { mapping(address => uint) public balances; function setBalance(address addr, uint amount) public { balances[addr] = amount; } } // 演示合约:创建并调用基础合约实例 contract CreateAndUseMapping { // 创建MappingExample合约实例,赋值给m变量 MappingExample m = new MappingExample(); function updateBalance(address addr, uint amount) public { // 通过m调用基础合约的函数 m.setBalance(addr, amount); } }
3. 新手核心概念拆解
- 合约类型变量:Solidity里合约本身是一种数据类型,你可以用它定义变量,用来指向链上已部署的合约实例。
new关键字的作用:new 合约名()会在区块链上部署一个该合约的全新实例,同时把实例的地址赋值给对应的合约变量,后续通过这个变量就能操作实例里的函数和状态。- 合约的独立性:每个合约都是独立的部署单元,Remix只会部署你选中的那个合约,其他未被引用调用的合约不会自动部署。
4. 新手学习资料方向
- 先聚焦Solidity基础语法中的「合约创建与交互」模块,搞懂合约之间的调用逻辑,再深入mapping的细节。
- 重点学习「合约类型」「合约实例化」这两个知识点,大部分新手入门教程都会有专门讲解。
- 跟着Remix官方入门教程实操,里面会逐步演示合约部署、调用,以及合约间的交互流程。
内容的提问来源于stack exchange,提问作者Angus
相关产品推荐
相关产品推荐

