13 个版本

0.5.5 2023年10月4日
0.5.4 2023年4月7日
0.5.2 2023年2月14日
0.5.1 2022年8月19日
0.1.1 2022年3月21日

Rust 模式 中排名 #241

Download history 15781/week @ 2024-03-14 20310/week @ 2024-03-21 16851/week @ 2024-03-28 16653/week @ 2024-04-04 15738/week @ 2024-04-11 15436/week @ 2024-04-18 16030/week @ 2024-04-25 14496/week @ 2024-05-02 15722/week @ 2024-05-09 15587/week @ 2024-05-16 16783/week @ 2024-05-23 17343/week @ 2024-05-30 18460/week @ 2024-06-06 15718/week @ 2024-06-13 17508/week @ 2024-06-20 14819/week @ 2024-06-27

每月下载量 69,137
137 个 crate 中使用 (14 个直接使用)

使用 MIT 许可证

13KB
203 行(不包括注释)

为用户类型模拟重新借用。

广义引用是一种具有引用语义的类型,但实际上并不是原生 Rust 引用(如 &T&mut T)。例如:

struct MyRefMut<'borrow> {
    a: &'borrow mut i32,
    b: &'borrow mut i32,
}

给定一个 &'a [mut] 引用到某个拥有对象的 &'b 视图,重新借用它意味着获取对拥有对象的有效 &'a 视图,这使得原始引用在它被丢弃之前无效,此时原始引用再次变为有效。

此 crate 定义了 traits,通过提供借用和重新借用的能力,使得广义引用的使用更加便捷。

特性

derive:此功能导入了一个 derive 宏辅助工具,用于实现用户类型的重新借用。它可以与具有相同成员名称的 Ref/RefMut 对的 struct 或 tuple struct 一起使用,其中一个包含共享引用,另一个包含可变引用。共享变体必须是 Copy,并且宏用于可变变体,并为这两种类型生成相关的 traits。

示例

由于我们不能在移动后使用非 Copy 的值,因此此代码无法编译。

fn takes_mut_option(o: Option<&mut i32>) {}

let mut x = 0;
let o = Some(&mut x);
takes_mut_option(o); // `o` is moved here,
takes_mut_option(o); // so it can't be used here.

可以通过展开选项、重新借用它,然后再将其包裹起来来解决这个问题。

fn takes_mut_option(o: Option<&mut i32>) {}

let mut x = 0;
let mut o = Some(&mut x);
takes_mut_option(o.as_mut().map(|r| &mut **r)); // "Reborrowing" the `Option`
takes_mut_option(o.as_mut().map(|r| &mut **r)); // allows us to use it later on.
drop(o); // can still be used here

使用此 crate,这可以缩短为:

use reborrow::ReborrowMut;

fn takes_mut_option(o: Option<&mut i32>) {}

let mut x = 0;
let mut o = Some(&mut x);
takes_mut_option(o.rb_mut()); // "Reborrowing" the `Option`
takes_mut_option(o.rb_mut()); // allows us to use it later on.
drop(o); // can still be used here

derive 宏可以与 struct 或 tuple struct 一起使用,并为 ReborrowReborrowMut 生成 trait 定义。

use reborrow::{ReborrowCopyTraits, ReborrowTraits};

#[derive(ReborrowCopyTraits)]
pub struct I32Ref<'a, 'b> {
    pub i: i32,
    pub j: &'a i32,
    pub k: &'b i32,
}

#[derive(ReborrowCopyTraits)]
pub struct I32TupleRef<'a, 'b>(pub i32, pub &'a i32, pub &'b i32);

#[derive(ReborrowTraits)]
#[Const(I32Ref)]
struct I32RefMut<'a, 'b> {
    i: i32,
    #[reborrow]
    j: &'a mut i32,
    #[reborrow]
    k: &'b mut i32,
}

#[derive(ReborrowTraits)]
#[Const(I32TupleRef)]
pub struct I32TupleRefMut<'a, 'b>(
    i32,
    #[reborrow] &'a mut i32,
    #[reborrow] &'b mut i32,
);

依赖

~220KB