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://opensource.org/licenses/MIT)
。
贡献
除非您明确声明,否则任何有意提交以包含在作品中的贡献,如Apache-2.0许可证所定义,均应按照上述方式双许可,无任何额外条款或条件。
依赖项
~0.3–0.8MB
~19K SLoC