Solidity 中的不可变量是在编译时就被确定的常量,也称为常量变量(constant variable)或只读变量(read-only variable)。这些变量在定义时必须立即初始化,并且在整个合约中都无法被修改,可以在函数内部使用,但是无法更改它们的值。
不可变量通常用于存储不需要更改的数据,例如合约地址或具有公认不变性的数值。由于这些变量在编译时就已经被确定了值,因此它们不需要在运行时被计算,从而可以帮助减少合约的 gas 费用。
示例代码:
pragma solidity ^0.8.0;
contract ImmutableExample {
// 定义一个不可变地址变量
address public immutable myAddress;
// 定义一个不可变数值变量
uint256 public immutable myNumber;
constructor(address _addr, uint256 _number) {
// 初始化不可变变量
myAddress = _addr;
myNumber = _number;
}
// 函数使用不可变变量
function getAddress() public view returns (address) {
return myAddress;
}
// 函数使用不可变变量,并且更新状态变量
function updateNumber(uint256 _newNumber) public {
// 下面的代码会导致编译错误,因为 myNumber 是不可变变量,无法被更改
// myNumber = _newNumber;
}
}
注:两个不可变变量 myAddress 和 myNumber在合约部署时被初始化,并且在整个合约生命周期内都无法被更改。
不可变变量在编译时就已经确定了值,因此访问它们的时候不需要消耗 gas,而更新不可变变量会导致编译错误。因此,使用不可变变量可以帮助减少合约的 gas 费用。