New crate: derive_destructure. It lets you destructure (and move fields out of) structs that implement Drop

Crates.io link - Github link - reddit post

If you’ve ever struggled with error E0509 “Cannot move out of type T, which implements the Drop trait”, then you know how annoying that error can be to resolve. It often involves ManuallyDrop, MaybeUninit, ptr::read(), or other tricky unsafe code. This crate encapsulates that unsafe code so you don’t have to write it.

How to use it:

Put this in your main.rs or lib.rs

#[macro_use]
extern crate derive_destructure;

Then mark a struct with #[derive(destructure)]. When you want to move values out of that struct, you can simply write

let (field_1, field_2, ...) = my_struct.destructure();

This turns the struct into a tuple of its fields without running the struct’s drop() method. You can then happily move elements out of this tuple.

An alternative API that turns the struct into a different struct that doesn’t implement Drop (instead of turning it into a tuple) is also available. Check the readme on Github for more info on that.

2 Likes