15 个版本
0.0.15 | 2024 年 5 月 18 日 |
---|---|
0.0.14 | 2023 年 5 月 2 日 |
#427 in Rust 模式
用于 2 crates
61KB
591 行
borrowme
Rust 缺失的复合借用。
Rust 包含两个可以转换自拥有到借用的兄弟特质:ToOwned
,Borrow
和 BorrowMut
。
这些可以转换大多数简单类型,如 &str
到和从 String
。但是,让我们从更广泛的角度来考虑这个问题。如何将具有生命周期的类型转换为不具有生命周期的类型?这个 crate 定义了自己的 ToOwned
、Borrow
和 BorrowMut
特质,它们与 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