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 模式
116,183 每月下载量
用于 552 个 crate (直接使用 30)
23KB
432 行
extend
使用扩展特性创建对您不拥有的类型的扩展,而不需要样板代码。
示例
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