我有一个 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>>>
并从中借用数据并返回它们,但这不起作用。怎样才能做到这一点?您可以使用 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()
}
您链接的问题的答案之一提到了这种方法,但我认为您忽略了答案的这一部分。