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

D-杜姆

我想与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,
}

它包含对a的引用Context,我认为这是编译失败的原因。但是我不确定如何Device从函数中返回a ,或者我不正确地思考应该如何编码。如果我想将该Device对象传递给其他函数怎么办?

彼得·霍尔

根据定义Context::devices,寿命'aDevice<'a>被绑定到的上下文的范围内,并且将成为无效(即会是一个悬空指针),如果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仍在范围内就可以使用

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

返回引用当前函数拥有的数据的值

Rust:返回一个引用当前函数拥有的数据的值

错误消息不清楚:返回引用当前函数拥有的数据的值

如何解决Rust中的“返回引用当前函数拥有的数据的值”错误?

如何避免filter_map()在Rust中出现错误“返回引用当前函数拥有的数据的值”?

如何解决“返回引用当前函数拥有的数据的值”(结构之间的实际依赖关系)

为什么在Rust中允许返回当前函数拥有的引用?

Entry :: Occupied.get()返回一个值,该值引用当前函数拥有的数据,即使hashmap应该具有所有权

为什么此函数返回(拥有的)值?

如何从函数返回拥有的数组?

Rust引用Vec当前函数错误拥有的数据

为什么我可以返回对函数拥有值的引用?

函数外部的“返回”问题

VBScript递归函数问题返回值

python类函数中的值返回问题

从Try函数返回值的问题

函数未返回值:范围问题

从函数返回多个数据的问题

VBA:从函数问题返回范围

关于从函数返回指针的问题

Python-函数返回问题

从 evalScript 函数返回变量的问题

关于返回指针的函数的问题

R 函数返回的评估问题

使用cos时,CUDA从__device__函数返回错误的值

函数内的ggplot不会返回带有数据点的散点图,而是返回带有数据帧值的散点图。如何解决这个问题?

将不可复制的拥有值传递给函数后尝试使用它们时的生命周期问题

“构建函数返回空值。有问题的小部件是:信息构建函数绝不能返回空值。返回一个空白空间”

语义问题:属性的合成吸气剂遵循可可命名约定返回“拥有的”对象