"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
移动它。
我知道这是一个 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
移动它。