9个不稳定版本

0.5.1 2023年8月10日
0.5.0 2023年6月24日
0.4.2 2022年8月23日
0.3.0 2022年8月22日
0.0.0 2022年8月19日

#862数据结构

每月31次下载

MIT/Apache

30KB
501

ref_kind

Crate Docs License

此crate提供了两种引用类型:不可变和可变。所有这些都在一个枚举 RefKind 中表示,允许存储不可变和可变引用。

但最重要的是,此crate允许通过创建一个新集合来存储这些引用,从而从集合中检索出许多可变引用。

为此,crate定义了一些有用的特性

  • MoveRefMoveMut 用于容器检索相应的引用类型,
  • Move 是上述特性的组合,
  • Many 用于实现了peekable迭代器、切片等的集合。

但没有任何阻止您为其他类型实现这些特性的理由!

示例

use core::array;

use ref_kind::{Many, RefKind, MoveError};

// Create an array of square of integers from 0 to 9
let mut array: [_; 10] = array::from_fn(|i| i * i);

// Create collection of mutable references on all of the array elements
let mut many: [_; 10] = array
    .iter_mut()
    .map(|sq| Some(RefKind::from(sq)))
    .collect::<Vec<_>>()
    .try_into()
    .unwrap();

// Move out mutable reference by index 1
// It is no longer in the `many`
let one = many.move_mut(1).unwrap();
assert_eq!(*one, 1);

// Move out immutable reference by index 4
// `many` now contains immutable reference, not mutable one
let four = many.move_ref(4).unwrap();
assert_eq!(*four, 16);
// Move it again: no panic here because immutable reference was copied
let four_again = many.move_ref(4).unwrap();
assert_eq!(four, four_again);

// This call will return an error because `many` contains no reference by index 1
let one_again = many.try_move_ref(1);
assert_eq!(one_again, Err(MoveError::BorrowedMutably));

#![no_std] 支持

此crate是一个 no_std crate。它只依赖于 core crate。

std 特性默认启用,要在 no_std 环境中使用它,应在 Cargo.toml 中禁用此crate的默认特性

[dependencies]
ref_kind = { version = "0.5.0", default-features = false }

#![禁止(不安全代码)]

此crate不包含任何 unsafe 代码。

标志

此crate具有以下Cargo特性

特性名称 描述
alloc alloc crate 中为 VecDequeBTreeMap 实现 Many 特性
std 在标准库中为 HashMap 实现 Many 特性,依赖于 alloc 特性
hashbrown hashbrown crate 中为 HashMap 实现 Many 特性

默认启用特性 std。您可以通过在 Cargo.toml 中使用 default-features = false 来禁用它。

这些特性被添加到这个 crate 中,以便它可以与常见的 Rust 集合一起使用,例如 VecHashMap

许可证

许可协议为以下之一:

任选其一。

依赖项

~155KB