1 个不稳定版本
0.1.0 | 2024年1月10日 |
---|
#34 在 #conditional
用于 more-options
9KB
93 行
Maybe Implements —
Maybe Implements 提供了可以用来可选实现特质的Rust过程宏属性。
可选特质的实际应用
技术上,提供的属性总是实现指定的特质。它可以与现有的 cfg_attr
属性结合使用,以条件性地实现一个或多个特质。这种行为的典型用例是可选地实现 Send
和 Sync
。
首先,假设你的crate中的异步行为是一个可选特性
[features]
async = ["maybe-impl"]
[dependencies]
maybe-impl = { version = "0.1.0", optional = true }
假设crate具有以下特质
#[cfg_attr(feature = "async", maybe_impl::traits(Send,Sync))]
trait Foo {
fn bar(&self);
}
当crate使用默认特性时,行为没有变化。当 async
特性启用时
cargo add my-crate --features async
特质被展开为
trait Foo: Send + Sync {
fn bar(&self);
}
使用泛型
如果你定义了一个需要 Send
和/或 Sync
的泛型特质,特别是,这将要求泛型类型约束匹配。目前,特质的别名是不稳定的,但是你可以通过定义一个具有泛型实现的标记特质来桥接这两个概念。
#[cfg(not(feature = "async"))]
trait Bar: Sized {}
#[cfg(not(feature = "async"))]
impl<T> Bar for T {}
#[cfg(feature = "async")]
trait Bar: Sized + Send + Sync {}
#[cfg(feature = "async")]
impl<T: Send + Sync> Bar for T {}
#[cfg_attr(feature = "async", maybe_impl::traits(Send,Sync))]
trait Foo<T: Bar> {
fn bar(&self, bar: &T);
}
默认的同步构建保持原样,而异步路径展开为等效的
trait Foo<T: Send + Sync>: Send + Sync {
fn bar(&self, bar: &T);
}
许可证
此项目根据 MIT 许可证 许可。
依赖项
~285–740KB
~18K SLoC