1个稳定版本

1.0.0 2019年7月8日

#5 in #destructure

Download history 3/week @ 2024-03-13 2/week @ 2024-03-20 18/week @ 2024-03-27 19/week @ 2024-04-03 1/week @ 2024-06-05 2/week @ 2024-06-12 52/week @ 2024-06-19 300/week @ 2024-06-26

355 每月下载
2 crates 中使用

MIT 许可证

20KB
267

derive_destructure

这个crate允许你解构实现了Drop trait的struct。

如果你曾经遇到过错误E0509 "无法从实现Drop trait的类型T中移动元素",那么这个crate可能适合你。

使用此crate,请在你的 lib.rsmain.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,但不实现任何特性行为(除了自动实现的特性行为,如SyncSend)。特别是,它没有实现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