#traits #extension #attributes #macro #proc-macro #no-alloc

无 std easy-ext

轻量级属性宏,用于轻松编写扩展 trait 模式

19 个版本 (3 个稳定版)

1.0.2 2024年5月30日
1.0.1 2022年9月29日
1.0.0 2021年8月24日
0.2.9 2021年7月3日
0.1.4 2019年3月10日

#1098 in Rust 模式

Download history 11662/week @ 2024-04-29 12265/week @ 2024-05-06 12376/week @ 2024-05-13 12290/week @ 2024-05-20 11944/week @ 2024-05-27 12650/week @ 2024-06-03 11444/week @ 2024-06-10 12829/week @ 2024-06-17 9376/week @ 2024-06-24 9482/week @ 2024-07-01 9295/week @ 2024-07-08 9616/week @ 2024-07-15 9579/week @ 2024-07-22 13533/week @ 2024-07-29 12558/week @ 2024-08-05 11864/week @ 2024-08-12

48,122 每月下载量
用于 93 个crate(24 个直接使用)

Apache-2.0 OR MIT

94KB
2K SLoC

easy-ext

crates.io docs.rs license msrv github actions

轻量级属性宏,用于轻松编写 扩展 trait 模式

[dependencies]
easy-ext = "1"

示例

use easy_ext::ext;

#[ext(ResultExt)]
pub impl<T, E> Result<T, E> {
    fn err_into<U>(self) -> Result<T, U>
    where
        E: Into<U>,
    {
        self.map_err(Into::into)
    }
}

如下代码将被生成

pub trait ResultExt<T, E> {
    fn err_into<U>(self) -> Result<T, U>
    where
        E: Into<U>;
}

impl<T, E> ResultExt<T, E> for Result<T, E> {
    fn err_into<U>(self) -> Result<T, U>
    where
        E: Into<U>,
    {
        self.map_err(Into::into)
    }
}

您可以省略 trait 名称。

use easy_ext::ext;

#[ext]
impl<T, E> Result<T, E> {
    fn err_into<U>(self) -> Result<T, U>
    where
        E: Into<U>,
    {
        self.map_err(Into::into)
    }
}

注意,在这种情况下,#[ext] 会分配一个随机名称,因此您不能导入/导出生成的 trait。

可见性

有两种方式来指定可见性。

Impl 级别可见性

第一种方式是在 impl 级别指定可见性。例如

use easy_ext::ext;

// unnamed
#[ext]
pub impl str {
    fn foo(&self) {}
}

// named
#[ext(StrExt)]
pub impl str {
    fn bar(&self) {}
}

关联项级别可见性

另一种方式是在关联项级别指定可见性。

例如,如果方法为 pub,则 trait 也将为 pub

use easy_ext::ext;

#[ext(ResultExt)] // generate `pub trait ResultExt`
impl<T, E> Result<T, E> {
    pub fn err_into<U>(self) -> Result<T, U>
    where
        E: Into<U>,
    {
        self.map_err(Into::into)
    }
}

这在将固有实现迁移到扩展 trait 时很有用。

请注意,impl 中所有关联项的可见性必须相同。

请注意,您不能同时指定 impl 级别可见性和关联项级别可见性。

超特性

如果您希望扩展 trait 成为另一个特质的子特质,请将 Self: SubTrait 约束添加到 where 子句中。

use easy_ext::ext;

#[ext(Ext)]
impl<T> T
where
    Self: Default,
{
    fn method(&self) {}
}

支持的项目

关联函数(方法)

use easy_ext::ext;

#[ext]
impl<T> T {
    fn method(&self) {}
}

关联常量

use easy_ext::ext;

#[ext]
impl<T> T {
    const MSG: &'static str = "Hello!";
}

关联类型

use easy_ext::ext;

#[ext]
impl str {
    type Owned = String;

    fn method(&self) -> Self::Owned {
        self.to_owned()
    }
}

许可证

根据您的选择,许可在 Apache 许可证,版本 2.0MIT 许可证 下。

除非您明确声明,否则您提交的任何有意包含在作品中的贡献,根据 Apache-2.0 许可证的定义,将根据上述方式双重许可,而无需任何额外的条款或条件。

无运行时依赖