6 个版本
| 0.1.3 | 2024年3月17日 |
|---|---|
| 0.1.2 | 2023年8月12日 |
| 0.1.1 | 2022年10月31日 |
| 0.1.0 | 2022年2月21日 |
| 0.0.2 | 2021年12月27日 |
#1 in #destructure
每月下载量 43,226
用于 17 个crate(5 个直接使用)
21KB
264 行
derive_destructure2 (无 std)
此crate允许您解构实现了 Drop 的结构体。
如果您曾经遇到过错误 E0509 "无法从实现了 Drop 特性的类型 T 中移动"的问题,那么这个crate可能适合您。
要使用此crate,将以下内容放入您的 lib.rs 或 main.rs(适用于 rust < 1.30)
#[macro_use]
extern crate derive_destructure2;
对于 rust >= 1.30,只需将其作为常规项导入
use derive_destructure2::{destructure, remove_trait_impls};
然后您有 2 种方式来使用此crate
选项 1: #[derive(destructure)]
如果您使用 #[derive(destructure)] 标记一个结构体,那么您可以使用您的crate来解构它
let (field_1, field_2, ...) = my_struct.destructure();
这会将结构体转换为其字段的元组 而不运行结构体的 drop() 方法。然后您可以从这个元组中愉快地移动元素。
注意:在 Rust 中,单个元素的元组表示为 (x,),而不是 (x)。
destructure 被实现为一个私有关联函数。
选项 2: #[derive(remove_trait_impls)]
如果您在结构体上标记了 #[derive(remove_trait_impls)],则可以在您的crate中进行操作
let my_struct = my_struct.remove_trait_impls();
结果是具有相同字段的相同结构体,但不实现任何特质(除了自动实现的特质,如 Sync 和 Send)。特别是,它不实现 Drop,因此您可以将字段从其中移动出来。
结果结构的名称是原始名称加上后缀 WithoutTraitImpls。
例如,Foo 变为 FooWithoutTraitImpls。但您通常不需要写出这个名称。
#[derive(remove_trait_impls)] 也适用于枚举。
remove_trait_impls 是一个私有关联函数。
示例
use derive_destructure2::*;
#[derive(destructure, remove_trait_impls)]
struct ImplementsDrop {
some_str: String,
some_int: i32
}
impl Drop for ImplementsDrop {
fn drop(&mut self) {
panic!("We don't want to drop this");
}
}
fn main() {
// Using destructure():
let x = ImplementsDrop {
some_str: "foo".to_owned(),
some_int: 4
};
let (some_str, some_int) = x.destructure();
// x's drop() method never gets called
// Using remove_trait_impls():
let x = ImplementsDrop {
some_str: "foo".to_owned(),
some_int: 4
};
let x = x.remove_trait_impls();
// this x doesn't implement drop,
// so we can move fields out of it
drop(x.some_str);
println!("{}", x.some_int);
}
许可证
根据您的选择,许可方式为以下之一
- Apache License, Version 2.0, (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT 或 https://open-source.org.cn/licenses/MIT)
。
贡献
除非您明确声明,否则任何有意提交以包含在作品中的贡献,如Apache-2.0许可证所定义,均应按照上述方式双许可,无任何额外条款或条件。
依赖项
~0.3–0.8MB
~19K SLoC