暂时将对象从一个成员移动到同一结构中的另一个成员?

时间:2017-06-19 18:35:58

标签: rust

我有一个缓冲区,我在逻辑上划分为段。每个细分使用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中是否可行?如果是这样,我该怎么做才能解决错误?

0 个答案:

没有答案