Skip to content

Latest commit

 

History

History
153 lines (115 loc) · 3.61 KB

14 枚举.md

File metadata and controls

153 lines (115 loc) · 3.61 KB

枚举

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,其中包含三个值:CreatedLockedInactive。通过在合同中声明一个状态变量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);
  }

}