So Foo is an existing API with a lot of other functionality, and I'd prefer not to have to change it to store an Option<T> (and then .unwrap() all over the place, which has runtime costs as well as costs in terms of code cleanliness, likelihood of introducing future bugs, etc) just to support this use case. If there's a way that allows me to leave the type definition as is, that'd be a lot better.
On that note: Assuming that the only way to do this is using unsafe, any thoughts on what the least-unsafe approach would be?
Oh, actually, there's a bit of negative reasoning for Drop: T: Copy.
If you can't make it Copy, then maybe ManuallyDrop<T>? But you'd have to still take &mut self and teach Foo not to drop it twice. Basically, reinvent Option::take anyway.