Solidity 构造函数

文章介绍了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” 旁边的框中。

https://static.wixstatic.com/media/61a666_a136b53ad685419582210f02b620e762~mv2.png/v1/crop/x_0,y_0,w_2000,h_973/fill/w_939,h_457,al_c,q_95,enc_auto/Constructor.png

与其他函数不同,calldata 不能用于数组和字符串,必须使用 memory

再次强调,出于我们现在无法深入探讨的原因,构造函数参数中不能使用 calldata。我知道,这似乎是一个非常奇怪和随机的限制,但在你理解以太坊的底层原理后,这会变得有意义。

以下是如何在构造时设置字符串:

contract ExampleContract {
    string public name;

    // 如果使用 calldata,编译时会出错
    constructor(string memory _name) {
        name = _name;
    }
}

你可能会想随意在任何地方使用 memory,而不去使用 calldata。但值得记住这一点,因为 calldata 会导致更便宜的交易(即用户更低的 gas 费用)。

此外,如果你想知道,构造函数不能返回值。

练习题

Deployer

了解更多与 RareSkills

查看 Solidity bootcamp 以了解更多有关智能合约开发和代币标准的知识。

  • 原文链接: rareskills.io/learn-soli...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
RareSkills
RareSkills
https://www.rareskills.io/