文章介绍了Solidity智能合约中的构造函数及其使用,包括如何设置合约部署时的变量,以及构造函数与普通函数的区别。
回到我们的滚动 ERC20 示例,我们做了一些奇怪的事情,我们直接在合约中设置了 banker 变量。
contract ERC20 {
address public banker = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
mapping(address => uint256) public balances;
function setSomeonesBalance(
address owner,
uint256 amount
)
public {
if (msg.sender == banker) {
balances[owner] = amount;
}
// 什么都不做
}
function transfer(
address receiver,
uint256 amount
)
public {
balances[msg.sender] -= amount;
balances[receiver] += amount;
}
}
这没问题,但是如果有人想要部署合约并且将自己设置为 banker 呢?
智能合约中有一个特殊的函数,在部署时被称为构造函数(constructor)。这与其他面向对象编程语言非常相似。下面是它的样子:
contract ExampleContract {
address public banker;
constructor() {
deployer = msg.sender;
}
}
请注意,它是 “constructor()” 而不是 “function constructor()”,并且我们不指定 public,因为构造函数不能使用 pure、view、public 等修饰符进行修改。
如果你希望 banker 由部署合约的人配置,那么你可以将其作为函数参数使用。
contract ExampleContract {
address public banker;
constructor(address _banker) {
banker = _banker;
}
}
顺便提一句,你会在构造函数中看到这种模式:变量 = _变量。这在 Solidity 中不是必需的,但被视为一种惯例。
在 Remix 上部署带有构造函数参数的合约时,你需要将参数放入出现在 “deploy” 旁边的框中。
与其他函数不同,calldata 不能用于数组和字符串,必须使用 memory
再次强调,出于我们现在无法深入探讨的原因,构造函数参数中不能使用 calldata。我知道,这似乎是一个非常奇怪和随机的限制,但在你理解以太坊的底层原理后,这会变得有意义。
以下是如何在构造时设置字符串:
contract ExampleContract {
string public name;
// 如果使用 calldata,编译时会出错
constructor(string memory _name) {
name = _name;
}
}
你可能会想随意在任何地方使用 memory,而不去使用 calldata。但值得记住这一点,因为 calldata 会导致更便宜的交易(即用户更低的 gas 费用)。
此外,如果你想知道,构造函数不能返回值。
练习题
查看 Solidity bootcamp 以了解更多有关智能合约开发和代币标准的知识。
- 原文链接: rareskills.io/learn-soli...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!