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 模式
48,122 每月下载量
用于 93 个crate(24 个直接使用)
94KB
2K SLoC
easy-ext
轻量级属性宏,用于轻松编写 扩展 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.0 或 MIT 许可证 下。
除非您明确声明,否则您提交的任何有意包含在作品中的贡献,根据 Apache-2.0 许可证的定义,将根据上述方式双重许可,而无需任何额外的条款或条件。