Skip to content

导入

导入对于代码的重用性和交互非常有用。通常,所有Sway程序类型都遵循相同的导入范式。

main.sw

sway
contract;
// 1. 在同一项目中进行导入
// "dep"关键字将库定义为程序内的依赖项
dep imports_library;

// 与之前的hello world示例不同,实际上在ABI中进行导入是一个好习惯
// 这也是一种好的做法,用这种方式定义和导入自定义错误

// "use"关键字在库中进行导入
use imports_library::*;

// 2. 导入标准库
// 标准库包含
//     a. 语言基元
//     b. 区块链上下文操作
//     c. 本地资产管理
//     等等。
// Solidity中的诸如msg.sender() block.timestamp()之类的功能在这里找到
// https://github.com/FuelLabs/sway/tree/master/sway-lib-std
use std::{
    identity::*,
    address::*,
    constants::*,
    auth::msg_sender,
};

// 3. 从不同项目导入库
// 注意,“math_lib”未在文件中列为依赖项,但在forc.toml中有
// 从 https://github.com/sway-libs/concentrated-liquidity/ 复制的数学库
use math_lib::full_math::*;

storage {
    z: u64 = 0,
    last_user: Identity = Identity::Address(Address::from(ZERO_B256)),
}

impl Imports for Contract {
    #[storage(write)]
    fn add(x: u64, y: u64) {
        storage.z = x + y;
    }

    #[storage(write)]
    fn last_user() {
        storage.last_user = msg_sender().unwrap();
    }

    #[storage(write)]
    fn fixed_point_multiply_and_divide(a: u64, b: u64, c: u64) {
        storage.z = mul_div_u64(a, b, c);
    }
}

标准库

本地

这是文件夹结构。

└── Import
    └── src
        ├── main.sw
        └── imports_library.sw

外部依赖

这是项目结构。

├── Import
│   ├── src
│   │   └── main.sw
│   └── Forc.toml
└── math_lib
    ├── concentrated
    │   ├── I24.sw
    │   ├── Q64x64.sw
    │   ├── Q128x128.sw
    │   └── full_math.sw
    └── math_lib.sw

外部导入应该在Forc.toml中被定义为依赖项。

Forc.toml

[project]
authors = ["Call Delegation"]
entry = "main.sw"
license = "Apache-2.0"
name = "imports"

[dependencies]
math_lib = { path = "../math_lib/" }

注意:如果您有一个复杂的库,最好为子库有一个入口点。

math_lib.sw

sway
library math_lib;

dep concentrated/I24;
dep concentrated/Q128x128;
dep concentrated/Q64x64;
dep concentrated/full_math;