#extension #traits

extend

使用扩展特性创建对您不拥有的类型的扩展,而不需要样板代码

15 个版本 (7 个稳定版)

1.2.0 2023 年 3 月 18 日
1.1.2 2021 年 9 月 2 日
1.1.1 2021 年 7 月 12 日
1.0.1 2021 年 2 月 14 日
0.1.0 2019 年 11 月 26 日

#193 in Rust 模式

Download history 27503/week @ 2024-03-14 30286/week @ 2024-03-21 28024/week @ 2024-03-28 30743/week @ 2024-04-04 28414/week @ 2024-04-11 30475/week @ 2024-04-18 34058/week @ 2024-04-25 29537/week @ 2024-05-02 26958/week @ 2024-05-09 26870/week @ 2024-05-16 25758/week @ 2024-05-23 28961/week @ 2024-05-30 32334/week @ 2024-06-06 33797/week @ 2024-06-13 24638/week @ 2024-06-20 19598/week @ 2024-06-27

116,183 每月下载量
用于 552 个 crate (直接使用 30)

MIT 许可证

23KB
432

extend

Crates.io Docs dependency status Build status maintenance-status

使用扩展特性创建对您不拥有的类型的扩展,而不需要样板代码。

示例

use extend::ext;

#[ext]
impl<T: Ord> Vec<T> {
    fn sorted(mut self) -> Self {
        self.sort();
        self
    }
}

fn main() {
    assert_eq!(
        vec![1, 2, 3],
        vec![2, 3, 1].sorted(),
    );
}

lib.rs:

使用扩展特性创建对您不拥有的类型的扩展,而不需要样板代码。

示例

use extend::ext;

#[ext]
impl<T: Ord> Vec<T> {
    fn sorted(mut self) -> Self {
        self.sort();
        self
    }
}

assert_eq!(
    vec![1, 2, 3],
    vec![2, 3, 1].sorted(),
);

它是如何工作的?

在底层,它为您指定的类型生成一个具有方法的特质,并实现这些方法。上面的代码大致展开为

trait VecExt<T: Ord> {
    fn sorted(self) -> Self;
}

impl<T: Ord> VecExt<T> for Vec<T> {
    fn sorted(mut self) -> Self {
        self.sort();
        self
    }
}

支持的项

扩展可以包含方法或关联常量

use extend::ext;

#[ext]
impl String {
    const CONSTANT: &'static str = "FOO";

    fn method() {
        // ...
        # todo!()
    }
}

配置

您可以配置

  • 特质的可见性。使用 pub impl ... 生成 pub trait ...。默认可见性为私有。
  • 生成的扩展特质的名称。例如:#[ext(name = MyExt)]。默认情况下,我们根据扩展的内容生成名称。
  • 生成的扩展特质应具有哪些超特质。默认情况下没有超特质。例如:#[ext(supertraits = Default + Clone)]

更多示例

use extend::ext;

#[ext(name = SortedVecExt)]
impl<T: Ord> Vec<T> {
    fn sorted(mut self) -> Self {
        self.sort();
        self
    }
}

#[ext]
pub(crate) impl i32 {
    fn double(self) -> i32 {
        self * 2
    }
}

#[ext(name = ResultSafeUnwrapExt)]
pub impl<T> Result<T, std::convert::Infallible> {
    fn safe_unwrap(self) -> T {
        match self {
            Ok(t) => t,
            Err(_) => unreachable!(),
        }
    }
}

#[ext(supertraits = Default + Clone)]
impl String {
    fn my_length(self) -> usize {
        self.len()
    }
}

为了向后兼容,您也可以将可见性声明为 #[ext] 的第一个参数

use extend::ext;

#[ext(pub)]
impl i32 {
    fn double(self) -> i32 {
        self * 2
    }
}

async-trait 兼容性

通过 async-trait 支持异步扩展。

请注意,您需要在以下位置添加 #[async_trait] 以下 #[ext]。否则,ext 宏无法看到 #[async_trait] 属性并在生成的代码中传递它。

示例

use extend::ext;
use async_trait::async_trait;

#[ext]
#[async_trait]
impl String {
    async fn read_file() -> String {
        // ...
        # todo!()
    }
}

其他属性

在以下位置提供的其他属性 以下 #[ext] 将传递给生成的特性和实现。有关示例,请参阅上方的 async-trait 兼容性

依赖关系

~265–710KB
~17K SLoC