gpt4 book ai didi

rust - 从函数返回 libusb::Device 的问题 - 尝试返回引用当前函数拥有的数据的值

转载 作者:行者123 更新时间:2023-12-03 11:36:40 30 4
gpt4 key购买 nike

我想与 USB 设备连接,所以我使用 libusb .我有一个返回 libusb::Device 的函数我感兴趣的设备:

pub fn obtain_device() -> Device<'static> {
let context: Context = libusb::Context::new().unwrap();
let option: Device = context
.devices()
.unwrap()
.iter()
.find(|d| d.device_descriptor().unwrap().vendor_id() == 0x0bda)
.unwrap();
option
}
但是,这不会编译:
error[E0515]: cannot return value referencing local variable `context`
--> src/usb/mod.rs:19:5
|
18 | let option: Device = context.devices().unwrap().iter().find(|d| d.device_descriptor().unwrap().vendor_id() == 0x0bda).unwrap();
| ------- `context` is borrowed here
19 | option
| ^^^^^^ returns a value referencing data owned by the current function
据我了解,它是 context对象它导致问题,即使这不是我从函数返回的对象。查看 libusb::Device 的定义
/// A reference to a USB device.
pub struct Device<'a> {
context: PhantomData<&'a Context>,
device: *mut libusb_device,
}
它包含对 Context 的引用我认为这是编译失败的原因。但我不确定如何返回 Device从函数中还是我没有正确思考应该如何编码。如果我想通过 Device 怎么办?反对其他功能?

最佳答案

基于 Context::devices 的定义, 生命周期 'aDevice<'a>绑定(bind)到上下文的范围,如果 Context 将变为无效(即,将是一个悬空指针)超出范围。也就是说,箱子不只是包装一些指向将永远存在的设备的指针,而是“通过”上下文访问设备。
解决此问题的一种方法是制作 Context静态的,所以它在你的程序的整个过程中都存在。您可以使用 lazy_static :

use lazy_static::lazy_static;
use libusb::{Context, Device};

lazy_static! {
static ref CONTEXT: Context = Context::new().unwrap();
}

pub fn obtain_device() -> Device<'static> {
CONTEXT
.devices()
.unwrap()
.iter()
.find(|d| d.device_descriptor().unwrap().vendor_id() == 0x0bda)
.unwrap()
}
你也可以把你的函数变成一个结构的方法,它拥有 Context .
pub struct MyDeviceContext {
context: libusb::Context,
}

impl MyDeviceContext {
pub fn new(context: libusb::Context) -> Self {
Self { context }
}

pub fn obtain_device(&self) -> Device<'_> {
self.context
.devices()
.unwrap()
.iter()
.find(|d| d.device_descriptor().unwrap().vendor_id() == 0x0bda)
.unwrap()
}
}
设备生命周期不再是 'static , 但只要 MyDeviceContext 就可以使用仍在范围内。

关于rust - 从函数返回 libusb::Device 的问题 - 尝试返回引用当前函数拥有的数据的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64832064/

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