#drop #destructure #derive #remove-trait-impls #e0509

无 std derive_destructure2

解构实现了 Drop 的结构体

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

Download history 11217/week @ 2024-03-16 11520/week @ 2024-03-23 7186/week @ 2024-03-30 14167/week @ 2024-04-06 14825/week @ 2024-04-13 14056/week @ 2024-04-20 16604/week @ 2024-04-27 9447/week @ 2024-05-04 12286/week @ 2024-05-11 9421/week @ 2024-05-18 9235/week @ 2024-05-25 14050/week @ 2024-06-01 9443/week @ 2024-06-08 10224/week @ 2024-06-15 15531/week @ 2024-06-22 5044/week @ 2024-06-29

每月下载量 43,226
用于 17 个crate(5 个直接使用)

MIT/Apache

21KB
264

derive_destructure2 (无 std)

Rust

crate.io downloads

crate.io version

docs

示例

此crate允许您解构实现了 Drop 的结构体。

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

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

结果是具有相同字段的相同结构体,但不实现任何特质(除了自动实现的特质,如 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许可证所定义,均应按照上述方式双许可,无任何额外条款或条件。

依赖项

~0.3–0.8MB
~19K SLoC