1个稳定版本
1.0.0 | 2019年7月8日 |
---|
#5 in #destructure
355 每月下载
在 2 crates 中使用
20KB
267 行
derive_destructure
这个crate允许你解构实现了Drop trait的struct。
如果你曾经遇到过错误E0509 "无法从实现Drop trait的类型T中移动元素",那么这个crate可能适合你。
使用此crate,请在你的 lib.rs
或 main.rs
中加入以下内容
#[macro_use]
extern crate derive_destructure;
然后你有两种方式来使用这个crate
选项1: #[derive(destructure)]
如果你对一个struct使用 #[derive(destructure)]
标记,那么你可以使用以下方式来解构它
let (field_1, field_2, ...) = my_struct.destructure();
这会将struct转换为其字段的元组,而不会运行struct的 drop()
方法。然后你可以从这个元组中愉快地移动元素。
注意:在Rust中,只有一个元素的元组表示为 (x,)
,而不是 (x)
。
选项2: #[derive(remove_trait_impls)]
如果你对一个struct使用 #[derive(remove_trait_impls)]
标记,那么你可以这样做
let my_struct = my_struct.remove_trait_impls();
结果是具有相同字段的struct,但不实现任何特性行为(除了自动实现的特性行为,如Sync
和Send
)。特别是,它没有实现Drop
,因此您可以将其字段移出。
生成的struct的名称是原始名称加上后缀WithoutTraitImpls
。例如,Foo
变为FooWithoutTraitImpls
。但通常您不需要写出这个名字。
#[derive(remove_trait_impls)]
也适用于枚举。
示例
#[macro_use]
extern crate derive_destructure;
#[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);
}
许可:MIT
依赖关系
~2MB
~46K SLoC