#traits #conditional #macro #send-sync #proc-macro

maybe-impl

提供条件实现一个或多个特质的支持

1 个不稳定版本

0.1.0 2024年1月10日

#34#conditional


用于 more-options

MIT 许可证

9KB
93

Maybe Implements — CI Crates.io MIT licensed

Maybe Implements 提供了可以用来可选实现特质的Rust过程宏属性。

可选特质的实际应用

技术上,提供的属性总是实现指定的特质。它可以与现有的 cfg_attr 属性结合使用,以条件性地实现一个或多个特质。这种行为的典型用例是可选地实现 SendSync

首先,假设你的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