5 个版本
0.1.4 | 2022年10月31日 |
---|---|
0.1.3 | 2022年2月21日 |
0.1.2 | 2021年12月27日 |
0.1.1 | 2021年12月27日 |
0.1.0 | 2021年12月27日 |
#2550 在 Rust模式
9KB
50 行
derive_destructure2 (无标准库)
这个crate允许你解构实现了Drop
的struct。
如果你曾经遇到过错误E0509 "无法从实现了Drop
trait的类型T
中移动",那么这个crate可能适合你。
要使用这个crate,将以下内容放入你的lib.rs
或main.rs
中(对于rust < 1.30)
#[macro_use]
extern crate derive_destructure2;
对于rust >= 1.30,只需将其作为常规项导入
use derive_destructure2::{derive_destructure, remove_trait_impls};
然后你有两种方式可以使用这个crate
选项1: #[derive(destructure)]
如果你使用#[derive(destructure)]
标记一个struct,那么你可以使用你的crate来解构它
let (field_1, field_2, ...) = my_struct.destructure();
这会将struct转换为其字段的元组,而不会运行struct的drop()
方法。然后你可以从这个元组中愉快地移动元素。
注意:在Rust中,1个元素的元组表示为(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许可证中定义,应按上述方式双重许可,不附加任何其他条款或条件。
依赖项
~270–720KB
~17K SLoC