【发布时间】:2017-02-14 08:02:49
【问题描述】:
我有一个 Reader 实例,其方法是 consumes the Reader and returns a Writer 和 Writer 可以类似地再次返回到 Reader。使用不可变是微不足道的,但我不知道如何向调用者隐藏不可变性,只是用可变的 Self 在幕后进行读写器的舞蹈。
基本上我想要这样的东西:
struct Container<'a> {
reader: Reader<'a, File>
}
fn update(&mut self) {
let writer = self.reader.as_writer();
writer.write_something();
self.reader = writer.as_reader();
}
这只会给出cannot move out of borrowed content 错误。试图在 Reader 周围添加 Box、Cell 或 RefCell,这会导致其他错误。
reader 可以隐藏在可变接口后面还是强制整个结构层次结构也可变? (即类似于 Haskell 中的 IO)
类型与实物匹配的自包含样本(我认为)
#[derive(Debug)]
struct NoCopy(u32);
#[derive(Debug)]
struct Flipper<'a, T: 'a> {
data: &'a mut T,
}
#[derive(Debug)]
struct Flopper<'a, T: 'a> {
data: &'a mut T,
}
impl<'a, T> Flipper<'a, T> {
fn flip(self) -> Flopper<'a, T> {
Flopper{data: self.data}
}
}
impl<'a, T> Flopper<'a, T> {
fn flop(self) -> Flipper<'a, T> {
Flipper{data: self.data}
}
}
#[derive(Debug)]
struct Container<'a, T: 'a> {
flipper: Flipper<'a, T>,
}
impl<'a, T> Container<'a, T> {
fn run(&mut self) {
self.flipper = self.flipper.flip().flop();
}
}
fn main() {
let f = Flipper{data: &mut NoCopy(42)};
let f = f.flip().flop();
println!("f={:?}", f);
let mut c = Container{flipper: f};
c.run();
println!("c={:?}", c);
}
错误[E0507]:无法移出借来的内容
--> src/main.rs:29:24
|
29 | self.flipper = self.flipper.flip().flop();
| ^^^^不能移出借来的内容
【问题讨论】: