库
在Sway中,库是用于定义新的常见行为的文件。
最突出的例子是Sway 标准库 它对于使用 forc new 创建的所有 Forc 项目都是隐式可用的。
编写库
在文件的开头使用 library 关键字来定义库, 后跟一个名称,以便它们可以被导入。
library;
// library code学习库设计时可参考的一个不错的库是 Sway 标准库。 例如, 标准库提供了一个enum Option<T>的实现 这是一种通用类型,使用变体Some(..)表示值的存在或使用变体None表示值的不存在。 实现Option<T>的Sway文件 具有以下结构:
library关键字:
library;- 一个从标准库内部的另一个库导入
revert的use语句:
use ::revert::revert;enum定义, 以关键字pub开头,表明Option<T>在option库外是公开可用的:
pub enum Option<T> {
// variants
}- 一个为
Option<T>实现了一些方法的impl块:
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示例如下:
[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 看起来像这样:
library;
mod block;
mod storage;
mod constants;
mod vm;
// .. 其他依赖其他库包含在 src 文件夹中,如 vm 库(在 src/vm.sw 中):
library;
mod evm;
// ...及其自己的子库 evm 位于 src/vm/evm.sw 中:
library;
// ...使用库
有两种基于其位置和如何导入的 Sway 库类型。
内部库
内部库位于项目的 src 目录中与 main.sw 一起或在适当的文件夹中,如下所示:
$ tree
.
├── Cargo.toml
├── Forc.toml
└── src
├── internal_lib.sw
├── main.sw
└── internal_lib
└── nested_lib.sw由于 internal_lib 是一个内部库,它可以像以下方式导入到 main.sw 中:
- 使用
mod关键字后跟库的名称,使内部库成为依赖项。 - 使用带有
::分隔库名和导入项的use关键字
mod internal_lib; // 假设 `internal_lib.sw` 中的库名是 `internal_lib`
use internal_lib::mint;
// `internal_library` 中的 `mint` 现在在这个文件中可用外部库
外部库位于主 src 目录之外,如下所示:
$ tree
.
├── my_project
│ ├── Cargo.toml
│ ├── Forc.toml
│ └─── src
│ └── main.sw
│
└── external_lib
├── Cargo.toml
├── Forc.toml
└─── src
└── lib.sw由于 external_lib 位于 my_project 的 src 目录之外,在导入之前,需要将库路径添加到 my_project 的 Forc.toml 文件的 dependencies 部分中作为依赖项:
[dependencies]
external_library = { path = "../external_library" }一旦将库依赖项添加到 toml 文件中,就可以像以下这样从其中导入项目:
- 确保要导入的项目使用
pub关键字声明(如果适用,例如:pub fn mint() {})。 - 使用
use关键字有选择地从库中导入项目。
use external_library::mint;
// `external_library` 中的 `mint` 现在在这个文件中可用使用 * 的通配符导入是可行的,但通常建议尽可能使用明确的导入。
注意: 标准库对于所有
Forc项目是隐式可用的,也就是说,你不需要在Forc.toml中手动将std指定为显式的依赖项。
参考 Sway 库
这个仓库 sway-libs 是一些外部库的集合,你可以在你的 Fuel 应用中导入并使用。 这些库旨在实现对 dapp 开发有价值的常见用例。
一些值得尝试的 Sway 库:
示例
你可以像导入和使用其他任何外部库一样,导入并使用一个Sway库,比如Ownership库
use ownership::Ownership;导入后,你可以在智能合约中使用该库的以下基本功能:
- 声明所有者
- 更改所有权
- 放弃所有权
- 确保只有所有者才能调用某个函数