"cannot return value referencing local variable" 返回 PhysicalDevice (Vulkano) 时

"cannot return value referencing local variable" when returning PhysicalDevice (Vulkano)

我知道这是一个 Rust 新手问题,但实际上我无法理解它。我需要传递 Vulkano 库中的 PhysicalDevice。问题是,PhysicalDevice 持有一个参考:

pub struct PhysicalDevice<'a> {
    instance: &'a Arc<Instance>,
    device: usize,
}

所以 Rust 不会编译我的神圣代码:

struct InstanceInfo<'a> {
    instance: Arc<Instance>,
    physical: PhysicalDevice<'a>,
    // ...
}

// ...

fn instantiate() -> InstanceInfo<'static> {
    // ...
    let instance = Instance::new(None, &required_extensions, None).unwrap();
    
    let physical = PhysicalDevice::enumerate(&instance).next().unwrap();
    // ...
    InstanceInfo { // cannot return value referencing local blah
        instance,
        physical,
        // ...
    }
}

我该如何解决这个问题?

所以出现错误消息的原因是 instance 是您的 instantiate 函数中的局部变量。因为您没有将其所有权移至 return 值,所以它将在函数结束时被删除。

但是如果它被删除,对它的任何引用都将无效。这就是为什么 Rust 不允许你 return 持有对局部变量的引用的东西。

首先,您的结构是多余的,因为 PhysicalDevice 已经包含该实例的引用。即使没有局部变量问题,我认为您也会 运行 陷入所有权问题。

其次,假设您重写并删除了 InstanceInfo 结构,而您只想 return 一个 PhysicalDevice<'static>。好吧,如果这是您向编译器承诺的,那么您必须确保您创建的 instance 将在程序存在的时间内存在。

你可以通过让 instance 成为模块的静态变量,或者在程序的最开始创建它然后简单地传递一个引用来做到这一点。

例如

fn main() {
 let instance = Instance::new(None, blablabla).unwrap();
 
 let physical = instantiate(&instance);
}

fn instantiate<'a>(instance: &'a Arc<Instance>) -> PhysicalDevice<'a> {
  PhysicalDevice::enumerate(instance).next().unwrap();
}

可能这里或那里有 & 错误,但这是它的要点。

如果您 将所有内容放入一个额外的结构中,那么我认为您想要做的是 clone Arc 而不仅仅是 Arc移动它。