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
每月下载量 69,137
在 137 个 crate 中使用 (14 个直接使用)
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 一起使用,并为 Reborrow
和 ReborrowMut
生成 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