Solidity中的枚举类型用于将常见的常量值分组。在本例中,我们将解释如何声明枚举类型,并讨论使用枚举类型的优点。
pragma solidity ^0.8.4;
contract Enum {
enum State { Created, Locked, Inactive }
State public state;
constructor() {
state = State.Created;
}
function lock() public {
state = State.Locked;
}
function unlock() public {
state = State.Inactive;
}
function isActive() public view returns (bool) {
return state == State.Created;
}
}
上面的示例声明了一个枚举类型State
,其中包含三个值:Created
,Locked
和Inactive
。通过在合同中声明一个状态变量state
并将其初始化为Created
,我们可以在合同的不同方法中改变它。
我们也可以在isActive
函数中使用枚举类型的优势之一:对于枚举类型,可以执行严格的比较,并根据需要返回布尔值。
// 状态开始时为Created
assert(Enum.State.Created == state);
// 锁定状态
e.lock();
assert(Enum.State.Locked == state);
// 解锁状态
e.unlock();
assert(Enum.State.Inactive == state);
// 确认其活跃性
assert(false == e.isActive());
在上面的输出中,我们可以看到枚举类型有效地分组了状态,并让我们以一种更直观和可读的方式向其他开发人员展示代码。
枚举类型在Solidity中非常有用,因为它们可以将常量值分组,并提供严格的比较和类型安全的列挺。它们可以用于构建各种分布式应用程序。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
contract Enum {
enum Status { //status枚举体
Pending,
Shipped,
Accepted,
Rejected,
Canceled
}
//Pending=0,Shipped=1,Accepted=2,Rejected=3,Canceled=4
// 默认值是 中列出的第一个元素
// 类型的定义,在本例中为Pending
Status public status;
// Returns uint
// Pending - 0
// Shipped - 1
// Accepted - 2
// Rejected - 3
// Canceled - 4
function get() public view returns (Status) {
return status; //status 是一个公共状态变量,默认会初始化为枚举的第一个值 Pending。
}
// 通过将 uint 传递到输入中来更新状态
function set(Status _status) public { //传一个类型为status状态
status = _status;
}
// 您可以像这样更新到特定的枚举
//修改枚举体
function cancel() public {
status = Status.Canceled;
}
// 删除 将枚举重置为其第一个值 0
function reset() public {
delete status;
}
}
代码示例
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
contract Enum {
event StatusChanged(Status prev, Status updated); //事件event,在状态变更时触发,便于跟踪
enum Status {
Pending,
Shipped,
Accepted,
Rejected,
Canceled
}
Status public status;
function get() public view returns (Status) {
return status;
}
function set(Status _status) public {
require(_status <= Status.Canceled, "Invalid status");
Status prev = status;
status = _status;
emit StatusChanged(prev, _status); //使用emit触发事件,而不是直接事件调用
}
function cancel() public {
Status prev = status;
status = Status.Canceled;
emit StatusChanged(prev, Status.Canceled);
}
function reset() public {
Status prev = status;
delete status;
emit StatusChanged(prev, Status.Pending);
}
}