#traits #object #pin #eq #ord #macro-derive

no-std fruit-salad

比较苹果和橙子(等等)。特质对象引用转换和特质对象比较。

2 个版本

0.0.2 2021 年 11 月 16 日
0.0.1 2021 年 9 月 29 日

#1529 in Rust 模式

MIT/Apache

37KB
449

fruit-salad

Lib.rs Crates.io Docs.rs

Rust 1.51 CI Crates.io - License

GitHub open issues open pull requests good first issues

crev reviews Zulip Chat

这是一个(主要)特质对象转换和比较的包。

没有注册表,而是通过 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 许可证定义的,您有意提交的任何贡献,均应按照上述方式双重许可,不附加任何额外条款或条件。

有关更多信息,请参阅 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