背景
通过学习Solidity,然后输出文章检验自己的学习成果github仓库
基础知识
- 不可变变量类似于
常量,但是少了一些约束 - 不可变变量的值可以在
构造函数中初始化或在声明时初始化,但初始化后就不能被修改了,这样可以节省gas,提高合约的安全性 - 值类型变量可以声明为
immutable - 和
constant不同,string和bytes不可以声明为immutable, - 在
Solidity 0.8.21之前,如果不对不可变变量,在构造函数或声明时初始化赋值,会报TypeError: Construction control flow ends without initializing all immutable state variables.
例子
该例子是如何对不可变变量进行赋值
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract Immutable {
address public immutable MY_ADDRESS;
uint public immutable MY_UINT;
uint public immutable MY_LOVE = 1118;
uint public immutable NO_USAGE;
constructor(uint _myUint){
MY_ADDRESS = msg.sender;
MY_UINT = _myUint;
}
}
程序解析
address public immutable MY_ADDRESS;
uint public immutable MY_UINT;
uint public immutable MY_LOVE = 1118;
uint public immutable NO_USAGE;
- 大写不可变变量的名称是一种编码习惯
NO_USAGE是用来展示不对不可变变量进行初始化,但是由于Solidity对每个变量都有默认值,所以部署后,访问这个值会返回0
constructor(uint _myUint){
MY_ADDRESS = msg.sender;
MY_UINT = _myUint;
}
不可变变量必须在构造函数的时候就赋值,构造函数只会在合约部署的时候调用一次