假设我有一个带有析构函数的铁 rust struct
:
pub struct D1 {
a: String,
b: String
}
impl Drop for D1 {
fn drop(&mut self) {
println!("{0}", self.a)
}
}
我想实现一个方法,将部分或所有字段移出对象,并在此过程中销毁它.显然,如果对象的析构函数运行,这是不能安全完成的-它将try 不安全地从移动的字段中读取.然而,如果析构函数以某种方式被 suppress ,它应该是安全的.但我找不到一种方法来压制 destruct 者,让移动变得安全.
mem::forget
不起作用,因为当涉及到析构函数时,编译器不会特别对待它:
impl D1 {
fn into_raw_parts(self) -> (String, String) {
let (a, b) = (self.a, self.b); // cannot move here
mem::forget(self);
(a, b)
}
}
ManuallyDrop
也不起作用-它只通过引用提供内部数据,防止移动:
use std::mem;
impl D1 {
fn into_raw_parts(self) -> (String, String) {
let md = mem::ManuallyDrop::new(self);
(md.a, md.b) // cannot move out of dereference
}
}
use std::mem;
impl D1 {
fn into_raw_parts(self) -> (String, String) {
let md = mem::ManuallyDrop::new(self);
(md.value.a, md.value.b) // field `value` is private
}
}
我大概可以通过使用unsafe
个代码来解决这个问题,但我想知道是否有一种安全的方法来做到这一点--我是不是错过了一些API或其他技术来告诉Rust我可以安全地移出一个值,因为我不打算运行析构函数?