我有一个缓冲区,我在逻辑上划分为段。每个细分使用SegmentBuilder
构建。我尝试暂时将缓冲区控制权交给SegmentBuilder
,直到完成其细分,然后创建新的SegmentBuilder
等等。
这是一个小例子:
struct SegmentBuilder {
segment: Vec<u32>,
start: usize,
end: usize,
}
impl SegmentBuilder {
fn with_vector_and_offset(vector: Vec<u32>, offset: usize) -> SegmentBuilder {
SegmentBuilder {
segment: vector,
start: offset,
end: offset,
}
}
fn append(&mut self, integer: u32) -> bool {
if self.end - self.start > 42 {
false
} else {
self.segment.push(integer);
self.end = self.end + 1;
true
}
}
fn seal(self) -> usize {
self.end
}
}
struct Buffer {
storage: Vec<u32>,
builder: Option<SegmentBuilder>,
}
impl Buffer {
fn new() -> Buffer {
Buffer {
storage: Vec::new(),
builder: None,
}
}
fn append(&mut self, integer: u32) {
if let Some(mut builder) = self.builder {
if !builder.append(integer) {
let offset = builder.seal();
self.builder = Some(SegmentBuilder::with_vector_and_offset(self.storage, offset));
}
} else {
self.builder = Some(SegmentBuilder::with_vector_and_offset(self.storage, 0));
self.append(integer);
}
}
}
这会产生编译错误:
error[E0507]: cannot move out of borrowed content
--> src/main.rs:46:36
|
46 | if let Some(mut builder) = self.builder {
| ----------- ^^^^ cannot move out of borrowed content
| |
| hint: to prevent move, use `ref builder` or `ref mut builder`
error[E0507]: cannot move out of borrowed content
--> src/main.rs:49:76
|
49 | self.builder = Some(SegmentBuilder::with_vector_and_offset(self.storage, offset));
| ^^^^ cannot move out of borrowed content
error[E0507]: cannot move out of borrowed content
--> src/main.rs:52:72
|
52 | self.builder = Some(SegmentBuilder::with_vector_and_offset(self.storage, 0));
| ^^^^ cannot move out of borrowed content
这种模式在Rust中是否可行?如果是这样,我该怎么做才能解决错误?