Rust - 返回拥有的价值和对价值的引用

问题描述 投票:0回答:1

我有一个 Rust 函数,它有固定的输入类型,但我可以选择返回类型:

fn foo(data: &[u8])

此函数需要对该切片进行更改,因此我创建了一个自有值,因此是

Vec<u8>
。我必须将该向量的某些部分提取到库定义的类型中,如下所示:

struct Foo<'a> {
    part1: &'a u8,
    part1: &'a u8,
    part1: &'a u8,
}

该结构体没有所属类型,并且其内部类型都是有生命周期的。这个结构可以用一个带有他的签名的函数来创建:

fn create(&'a [u8]) -> Foo<'a>

如何返回这样的类型?我不能只是返回它,因为它引用了一个局部变量(向量),该变量将在函数末尾被删除。我也不能只返回向量和 Foo 结构,因为这会移动向量,并使对它的引用无效。

如果有任何帮助,该结构是来自板条箱的

X509CertificationRequest
x509_parser

我尝试将向量转换为

Pin<Box<Vec<u8>>>
并从中借用数据并返回它们,但这不起作用。怎样才能做到这一点?
我已经阅读了thisthis问题,但我发现它们对我的情况没有帮助,因为它们都建议重写结构,而我不能这样做。

rust borrow-checker ownership
1个回答
0
投票

您可以使用 ouroboros 定义一个可以返回的结构体,其中包含临时向量和

Foo
:

#[ouroboros::self_referencing]
struct Return {
    vec: Vec<u8>,
    #[borrows(vec)]
    #[covariant]
    foo: Foo<'this>,
}

然后您可以像这样使用它:

fn create<'a>(arr: &'a [u8]) -> Return {
    let mut inner = arr.to_vec();
    ReturnBuilder {
        vec: inner,
        foo_builder: |vec|{
            Foo {
                part1: &vec[0],
                part2: &vec[1],
                part3: &vec[2],
            }
        },
    }.build()
}

您链接的问题的答案之一提到了这种方法,但我认为您忽略了答案的这一部分。

© www.soinside.com 2019 - 2024. All rights reserved.