#derive #example #struct #drop #destructure #traits #derive-destructure2

derive_destructure2_examples

crate derive_destructure2 的示例

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日

#2550Rust模式

MIT/Apache

9KB
50

derive_destructure2 (无标准库)

Rust

crate.io downloads

crate.io version

docs

示例

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

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

要使用这个crate,将以下内容放入你的lib.rsmain.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();

结果是具有相同字段的同一结构体,但不实现任何特性(除了自动实现的特性如 SyncSend)。特别是,它不实现 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-2.0许可证中定义,应按上述方式双重许可,不附加任何其他条款或条件。

依赖项

~270–720KB
~17K SLoC