Appearance
不可变量
Solidity
是一种智能合约编程语言,具有不可变量的概念。
在 Solidity
中有两种类型的不可变量:常量和不可变状态变量。常量是在编译时确定的只读变量,并且只能是值类型(如整数、字符串、地址等)。
不可变状态变量是在合约发布时确定的变量,它们的值在部署合约后不能被修改。下面将分别解释这两种不可变量。
常量
常量可以通过关键字 constant
或 immutable
定义。
两者的不同之处在于,constant
定义的常量在 Solidity 0.5.0
版本后已经废弃,建议使用immutable
代替。
solidity
pragma solidity ^0.8.0;
contract MyContract {
uint256 constant MY_CONSTANT = 12345;
// 或者使用不推荐的语法:
// uint256 constant public MY_CONSTANT_2 = 23456;
function getValue() public pure returns (uint256) {
return MY_CONSTANT;
}
}
在上述代码中,我们定义了一个名为 MY_CONSTANT
的常量,它的值为 12345
,类型是 uint256
。
在本例中,我们还提供了一个名为 getValue()
的公共函数,该函数返回这个常量的值,因为它是一个只读变量,所以我们将这个函数定义为 pure
类型。
不可变状态变量
不可变状态变量是在合约发布时确定的,它的值不能被改变。
我们可以使用关键字 immutable
定义它们,这些变量必须在声明时或在构造函数中被初始化。
与常量不同,不可变状态变量可以是值类型或引用类型(如结构体)。
solidity
pragma solidity ^0.8.0;
contract MyContract {
struct Person {
string name;
uint age;
}
// 不可变状态变量
immutable Person public MY_PERSON = Person("Alice", 25);
function getPersonName() public view returns (string memory) {
return MY_PERSON.name;
}
function getPersonAge() public view returns (uint) {
return MY_PERSON.age;
}
}
在上述代码中,我们定义了一个结构体 Person
,它有两个属性:name
和 age
。
接下来,我们定义了一个不可变状态变量 MY_PERSON
,它的类型是 Person
,并在声明时初始化。
我们还提供了两个函数 getPersonName()
和 getPersonAge()
,它们分别返回 MY_PERSON
的 name
和 age
属性。
通过使用不可变变量,我们可以确保某些值在合约发布后不会被修改,这有助于确保智能合约的安全性。