2 个版本
0.0.2 | 2021 年 11 月 16 日 |
---|---|
0.0.1 | 2021 年 9 月 29 日 |
#1529 in Rust 模式
37KB
449 行
fruit-salad
这是一个(主要)特质对象转换和比较的包。
没有注册表,而是通过 derive 宏直接将目标嵌入到 Dyncast
特质实现中。
具体类型也可以作为目标,通过重新解释转换进行不安全的使用。
(这受制于 #[deny(unsafe_code)]
.)
它还执行可变性和 pin 投影,同时关于文本大小方面很节省…
基本上,我需要的是比现有解决方案简单一点的,然后事情就有点升级了。
最初作为 rhizome
的一部分开发,但现在已独立,此包也很好地与 pinus
结合使用。
安装
请使用 cargo-edit 来始终添加此库的最新版本
cargo add fruit-salad --features macros
示例
#[cfg(feature = "macros")]
{
#![allow(clippy::eq_op)] // Identical args are intentional.
use core::fmt::Debug;
use fruit_salad::Dyncast; // With feature `"macros"`.
#[derive(PartialEq, Dyncast, Hash)]
#[dyncast(Self, impl dyn DynHash)]
struct A;
#[derive(Debug, PartialEq, PartialOrd, Dyncast)]
#[dyncast(Self, dyn Debug)]
#[dyncast(impl dyn PartialEq<dyn Dyncast>, impl dyn PartialOrd<dyn Dyncast>)]
struct B;
let a: &dyn Dyncast = &A;
let b: &dyn Dyncast = &B;
assert_ne!(a, a); // Partial equality isn't exposed.
assert_eq!(b, b);
assert_ne!(a, b);
assert_ne!(b, a);
assert_eq!(a.partial_cmp(a), None); // Partial order isn't exposed.
assert_eq!(b.partial_cmp(b), Some(core::cmp::Ordering::Equal));
assert_eq!(a.partial_cmp(b), None);
assert_eq!(b.partial_cmp(a), None);
assert_eq!(format!("{:?}", a), "dyn Dyncast = !dyn Debug");
assert_eq!(format!("{:?}", b), "dyn Dyncast = B");
assert!(a.dyncast::<dyn Debug>().is_none());
assert!(b.dyncast::<dyn Debug>().is_some());
// Also: `…_mut`, `…_pinned`, `…_box` and combinations thereof, as well as `…ptr`.
// `…box` methods require the `"alloc"` feature.
let _a: &A = a.dyncast().unwrap();
let _b: &B = b.dyncast().unwrap();
}
许可证
许可方式为以下之一
- Apache 许可证 2.0 版(《LICENSE-APACHE》或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证(《LICENSE-MIT》或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意提交的任何贡献,均应按照上述方式双重许可,不附加任何额外条款或条件。
有关更多信息,请参阅 CONTRIBUTING。
行为准则
变更日志
版本控制
fruit-salad
严格遵循 语义版本控制 2.0.0,但有以下例外
- 次要版本在主要版本变更时不会重置为 0(v1 除外)。
将其视为全局功能级别。 - 补丁版本在主版本或次版本更改时不会重置为0(除非是v0.1和v1)。
可以将其视为全局补丁级别。
这包括上述指定的Rust版本要求。
较早的Rust版本可能兼容,但可能会随着次版本或补丁版本的变化而变化。
受功能和补丁影响的具体版本可以通过CHANGELOG.md中的相应标题来确定。
请注意,此crate的依赖项可能有更宽松的MSRV策略!如果您不手动生成Cargo.lock(或根据需要生成)并且需要支持比当前稳定版更旧的编译器,请在您的自动化工具中使用cargo +nightly update -Z minimal-versions
。
依赖项
~0–560KB
~11K SLoC