Skip to content

在Sway中,库是用于定义新的常见行为的文件。

最突出的例子是Sway 标准库 它对于使用 forc new 创建的所有 Forc 项目都是隐式可用的。

编写库

在文件的开头使用 library 关键字来定义库, 后跟一个名称,以便它们可以被导入。

sway
library;

// library code

学习库设计时可参考的一个不错的库是 Sway 标准库。 例如, 标准库提供了一个enum Option<T>实现 这是一种通用类型,使用变体Some(..)表示值的存在或使用变体None表示值的不存在。 实现Option<T>的Sway文件 具有以下结构:

  • library 关键字:
sway
library;
  • 一个从标准库内部的另一个库导入 revertuse 语句:
sway
use ::revert::revert;
  • enum 定义, 以关键字 pub 开头,表明 Option<T>option 库外是公开可用的:
sway
pub enum Option<T> {
    // variants
}
  • 一个为Option<T>实现了一些方法的 impl 块:
sway
impl<T> Option<T> {

    fn is_some(self) -> bool {
        // is_some 主体
    }

    // 其他方法
}

现在option已经编写好了, 并且由于Option<T> 是使用 pub 关键字定义的,因此我们现在能从任何Sway项目中导入Option<T> 使用 use std::option::Option; 从任何 Sway 项目中导入,并可以访问其所有变体和方法。也就是说, Option标准库中自动可用,所以你实际上不必手动引入它.

库仅由一个 Forc.toml 文件 和一个src目录组成, 与合约不同,合约通常还包含一个tests 目录和一个 Cargo.toml文件。 库的Forc.toml示例如下:

toml
[project]
authors = ["Fuel Labs <contact@fuel.sh>"]
entry = "lib.sw"
license = "Apache-2.0"
name = "my_library"

[dependencies]

这表示作者、一个入口文件、它可以被导入的名称以及任何依赖项。

对于大型库,建议有一个lib.sw入口点来重新导出所有其他的子库。

mod 关键字注册子模块,使其项目(如functions和structs)可从父级库访问。 如果在顶层使用,将引用到 src 文件夹中的文件,在其他情况下,则是引用以库命名的文件夹下的文件

例如,标准库的 lib.sw 看起来像这样:

sway
library;

mod block;
mod storage;
mod constants;
mod vm;
// .. 其他依赖

其他库包含在 src 文件夹中,如 vm 库(在 src/vm.sw 中):

sway
library;

mod evm;
// ...

及其自己的子库 evm 位于 src/vm/evm.sw 中:

sway
library;

// ...

使用库

有两种基于其位置和如何导入的 Sway 库类型。

内部库

内部库位于项目的 src 目录中与 main.sw 一起或在适当的文件夹中,如下所示:

bash
$ tree
.
├── Cargo.toml
├── Forc.toml
└── src
    ├── internal_lib.sw
    ├── main.sw
    └── internal_lib
        └── nested_lib.sw

由于 internal_lib 是一个内部库,它可以像以下方式导入到 main.sw 中:

  • 使用 mod 关键字后跟库的名称,使内部库成为依赖项。
  • 使用带有 :: 分隔库名和导入项的 use 关键字
sway
mod internal_lib; // 假设 `internal_lib.sw` 中的库名是 `internal_lib`

use internal_lib::mint;

// `internal_library` 中的 `mint` 现在在这个文件中可用

外部库

外部库位于主 src 目录之外,如下所示:

bash
$ tree
.
├── my_project
   ├── Cargo.toml
   ├── Forc.toml
   └─── src
       └── main.sw

└── external_lib
    ├── Cargo.toml
    ├── Forc.toml
    └─── src
        └── lib.sw

由于 external_lib 位于 my_projectsrc 目录之外,在导入之前,需要将库路径添加到 my_projectForc.toml 文件的 dependencies 部分中作为依赖项:

toml
[dependencies]
external_library = { path = "../external_library" }

一旦将库依赖项添加到 toml 文件中,就可以像以下这样从其中导入项目:

  • 确保要导入的项目使用 pub 关键字声明(如果适用,例如:pub fn mint() {})。
  • 使用 use 关键字有选择地从库中导入项目。
sway
use external_library::mint;

// `external_library` 中的 `mint` 现在在这个文件中可用

使用 * 的通配符导入是可行的,但通常建议尽可能使用明确的导入。

注意: 标准库对于所有 Forc 项目是隐式可用的,也就是说,你不需要在 Forc.toml 中手动将 std 指定为显式的依赖项。

参考 Sway 库

这个仓库 sway-libs 是一些外部库的集合,你可以在你的 Fuel 应用中导入并使用。 这些库旨在实现对 dapp 开发有价值的常见用例。

一些值得尝试的 Sway 库:

示例

你可以像导入和使用其他任何外部库一样,导入并使用一个Sway库,比如Ownership

sway
use ownership::Ownership;

导入后,你可以在智能合约中使用该库的以下基本功能:

  • 声明所有者
  • 更改所有权
  • 放弃所有权
  • 确保只有所有者才能调用某个函数