#生命周期 #借用 #

no-std borrowme

Rust 缺失的复合借用

15 个版本

0.0.15 2024 年 5 月 18 日
0.0.14 2023 年 5 月 2 日

#427 in Rust 模式


用于 2 crates

MIT/Apache

61KB
591

borrowme

github crates.io docs.rs build status

Rust 缺失的复合借用。

Rust 包含两个可以转换自拥有到借用的兄弟特质:ToOwnedBorrowBorrowMut

这些可以转换大多数简单类型,如 &str 到和从 String。但是,让我们从更广泛的角度来考虑这个问题。如何将具有生命周期的类型转换为不具有生命周期的类型?这个 crate 定义了自己的 ToOwnedBorrowBorrowMut 特质,它们与 std 中的类似,但实现方式允许它们不仅对简单引用,而且对具有生命周期的复合类型进行操作。

为了帮助我们实现这些特质,提供了 #[borrowme] 属性宏(参见本节 了解为什么它不是 derive)。

#[borrowme]
#[derive(Clone)]
#[borrowed_attr(derive(Copy))]
struct Word<'a> {
    text: &'a str,
}

由此我们得到了以下类型和实现

#[derive(Clone, Copy)]
struct Word<'a> {
    text: &'a str,
}

#[derive(Clone)]
struct OwnedWord {
    text: String,
}

impl borrowme::ToOwned for Word<'_> {
    type Owned = OwnedWord;

    fn to_owned(&self) -> OwnedWord {
        /* .. */
    }
}

impl borrowme::Borrow for OwnedWord {
    type Target<'a> = Word<'a>;

    fn borrow(&self) -> Word<'_> {
        /* .. */
    }
}

仅此而已并不是很多,但是这里有一个大技巧。使用此 crate 的类型可以组合并按需转换为它们的借用或拥有对应类型

use std::collections::HashMap;

#[borrowme]
struct Word<'a> {
    text: &'a str,
}

#[borrowme]
struct Dictionary<'a> {
    words: HashMap<&'a str, Word<'a>>,
}

let dictionary = Dictionary {
    /* .. */
};

let owned_dictionary: OwnedDictionary = borrowme::to_owned(&dictionary);
let dictionary2: Dictionary<'_> = borrowme::borrow(&owned_dictionary);

依赖项

~260–710KB
~17K SLoC