9. 常数 constant 与 immutable
状态变量在声明constant
(常量)和immutable
(不变量)这个两个关键字之后,就不能在合约后更改数值。这样做还可以节省gas
。
另外,immutable
只能作用于数值变量。
这两个常数属性的意义是节省gas
的同时提升合约安全性。
constant:定义时就初始化
constant
变量必须在声明的时候初始化,之后再也不能改变。尝试改变的话,编译不通过。
// constant变量必须在声明的时候初始化,之后不能改变
uint256 constant CONSTANT_NUM = 10;
string constant CONSTANT_STRING = "0xAA";
bytes constant CONSTANT_BYTES = "WTF";
address constant CONSTANT_ADDRESS = 0x0000000000000000000000000000000000000000;
immutable:定义、全局变量、构造函数初始化
immutable
变量可以在声明时或构造函数中初始化,因此更加灵活。
// immutable变量可以在constructor里初始化,之后不能改变
uint256 public immutable IMMUTABLE_NUM = 9999999999;
address public immutable IMMUTABLE_ADDRESS;
uint256 public immutable IMMUTABLE_BLOCK;
uint256 public immutable IMMUTABLE_TEST;
你可以使用全局变量例如address(this)
,block.number
,或者自定义的函数给immutable
变量初始化。在下面这个例子,我们利用了test()
函数给IMMUTABLE_TEST
初始化为9
:
// 利用constructor初始化immutable变量,因此可以利用
constructor(){
IMMUTABLE_ADDRESS = address(this);
IMMUTABLE_BLOCK = block.number;
IMMUTABLE_TEST = test();
}
function test() public pure returns(uint256){
uint256 what = 9;
return(what);
}
在remix上验证
-
部署好合约之后,通过remix上的
getter
函数,能获取到constant
和immutable
变量初始化好的值。 -
constant
变量初始化之后,尝试改变它的值,会编译不通过并抛出TypeError: Cannot assign to a constant variable.
的错误。
文章来源:https://www.toymoban.com/news/detail-713722.html
-
immutable
变量初始化之后,尝试改变它的值,会编译不通过并抛出TypeError: Immutable state variable already initialized.
的错误。
习题
合约的部署者地址、合约的部署时间、合约本身的地址都适合用 constant 或 immutable 来修饰,但合约中的 ETH 数量不适合用 constant 或 immutable 来修饰文章来源地址https://www.toymoban.com/news/detail-713722.html
到了这里,关于9. solidity 常数 constant 与 immutable的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!