gpt4 book ai didi

rust - 我可以拥有既可以从切片又可以从拥有的缓冲区构造的结构吗?

转载 作者:行者123 更新时间:2023-11-29 08:00:27 24 4
gpt4 key购买 nike

我会尽量说清楚。假设我有:

struct Foo<'a> {
buffer: &'a [u8],
}

impl<'a> Foo<'a> {
fn create_builder() -> FooBuilder {
FooBuilder::new()
}

fn from_slice(slice: &[u8]) -> Foo {
Foo { buffer: slice }
}
}

struct FooBuilder {
in_progress_buffer: Vec<u8>,
}

impl FooBuilder {
fn new() -> FooBuilder {
FooBuilder { in_progress_buffer: Vec::new() }
}

fn push(&mut self, item: u8) {
self.in_progress_buffer.push(item);
}

fn build_foo(self) -> Foo {
Foo { buffer: self.in_progress_buffer }
}
}

fn main() {
// Option1: Gradually construct Foo from FooBuilder
let mut foo_builder = FooBuilder::new();
foo_builder.push(7);
let foo = foo_builder.build_foo();

// Option2: Construct Foo from a slice
let v = vec![7];
let foo2 = Foo::from_slice(&v);
}

这给出了一个编译错误:

error[E0106]: missing lifetime specifier
--> src/main.rs:28:27
|
28 | fn build_foo(self) -> Foo {
| ^^^ expected lifetime parameter
|
= help: this function's return type contains a borrowed value, but there is no value for it to be borrowed from
= help: consider giving it a 'static lifetime

这种模式可能吗?我该如何修复编译错误?我不确定要给出什么生命周期说明符,因为在 FooBuilder 版本中,FooBuilder 拥有缓冲区,我不想强​​制 Foo 用户在使用 Foo 的整个持续时间内将 FooBuilder 保持在范围内

最佳答案

你可以使用std::borrow::Cow;作为 docs状态:

it can enclose and provide immutable access to borrowed data, and clone the data lazily when mutation or ownership is required

use std::borrow::Cow;

struct Foo<'a> {
buffer: Cow<'a, [u8]>,
}

impl<'a> Foo<'a> {
fn create_builder() -> FooBuilder {
FooBuilder::new()
}

fn from_slice(slice: &[u8]) -> Foo {
Foo { buffer: slice.into() } // note .into()
}
}

struct FooBuilder {
in_progress_buffer: Vec<u8>,
}

impl<'a> FooBuilder {
fn new() -> FooBuilder {
FooBuilder { in_progress_buffer: Vec::new() }
}

fn push(&mut self, item: u8) {
self.in_progress_buffer.push(item);
}

fn build_foo(self) -> Foo<'a> {
Foo { buffer: self.in_progress_buffer.into() } // note .into()
}
}

此外,您需要使 foo_builder 可变,以便能够对其执行 push

关于rust - 我可以拥有既可以从切片又可以从拥有的缓冲区构造的结构吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44677049/

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