我會盡量做到儘可能清楚。假設我有:我可以擁有可以從切片和擁有緩衝區構建的結構嗎?
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
用戶保持FooBuilder
範圍的整個期間Foo
用於
乍一看你可以使用['CoW'](https://doc.rust-lang.org/stable/std/borrow/enum.Cow.html)。 :) –
爲什麼Foo不擁有緩衝區? – Boiethios
@Boiethios我想讓Foo從一個slice中被反序列化。 Foo提供了檢查切片的方法(例如,緩衝區中有多少項目設置爲42),但它從不改變緩衝區 – Shmoopy