gpt4 book ai didi

rust - 我怎样才能将一个值从参数中移出到 Drop::drop()?

转载 作者:行者123 更新时间:2023-11-29 07:46:43 29 4
gpt4 key购买 nike

我正在使用 gfx-hal,这需要我创建需要使用特定于其类型的函数显式销毁的资源。我想将这些类型的实例存储在结构中,并且我还想将清理它们与拥有结构的生命周期相关联,而不是手动管理它们的生命周期并可能在 GPU 上/驱动程序中存在对象永远。

但是,destroy 函数族中的所有函数都直接采用类型,而不是引用,因此当我尝试从我的结构中传递它们时,我会收到如下错误:

error[E0509]: cannot move out of type `S`, which implements the `Drop` trait
--> src/lib.rs:9:18
|
9 | destroyT(self.member)
| ^^^^^^^^^^^ cannot move out of here

似乎应该有一些解决这个问题的方法,因为我目前在 Drop::drop 函数本身中,所以 self 已经“消耗掉了。 “如何从 self 中获取这些类型的实例作为 T,而不是 &T

struct T;

struct S {
member: T,
}

impl Drop for S {
fn drop(&mut self) {
destroyT(self.member)
}
}

// elsewhere, in a library

fn destroyT(t: T) {
//...
}

最佳答案

最安全、最简单的方法是使用Option:

struct T;

impl Drop for T {
fn drop(&mut self) {
println!("dropping T");
}
}

struct S {
member: Option<T>,
}

impl Drop for S {
fn drop(&mut self) {
if let Some(t) = self.member.take() {
destroy_t(t);
}
}
}

fn destroy_t(_t: T) {
println!("destroy T");
}

fn main() {
let _x = S { member: Some(T) };
}

您可以选择对 MaybeUninit 使用不安全代码和 swap out the current value对于未初始化的:

use std::mem::{self, MaybeUninit};

struct T;

impl Drop for T {
fn drop(&mut self) {
println!("dropping T");
}
}

struct S {
member: MaybeUninit<T>,
}

impl Drop for S {
fn drop(&mut self) {
let invalid_t = MaybeUninit::uninit();
let valid_t = mem::replace(&mut self.member, invalid_t);
let valid_t = unsafe { valid_t.assume_init() };
destroy_t(valid_t);
// Dropping MaybeUninit does nothing
}
}

fn destroy_t(_t: T) {
println!("destroy T");
}

fn main() {
let _x = S {
member: MaybeUninit::new(T),
};
}

另见:

关于rust - 我怎样才能将一个值从参数中移出到 Drop::drop()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53254645/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com