【发布时间】:2018-09-07 14:53:58
【问题描述】:
我想要一个结构体,它有一个可写字段,但显式可借用:
struct App<W: Clone<BorrowMut<Write>>> {
stdout: W,
}
...所以它可以在内部使用它:
impl<W: Clone<BorrowMut<Write>>> App<W> {
fn hello(&mut self) -> Result<()> {
Rc::clone(&self.stdout).borrow_mut().write(b"world\n")?;
Ok(())
}
}
我尝试将光标传递给它,然后使用它:
let mut cursor = Rc::new(RefCell::new(Cursor::new(vec![0])));
let mut app = App { stdout: cursor };
app.hello().expect("failed to write");
let mut line = String::new();
Rc::clone(&cursor).borrow_mut().read_line(&mut line).unwrap();
锈皮:
error[E0107]: wrong number of type arguments: expected 0, found 1
--> src/bin/play.rs:6:21
|
6 | struct App<W: Clone<BorrowMut<Write>>> {
| ^^^^^^^^^^^^^^^^ unexpected type argument
我的最终目标:将stdin、stdout 和stderr 传递给App 结构。在fn main 中,这些将是真正的标准输入/标准输出/标准错误。在测试中,这些可能是游标。因为我需要在App 之外访问这些(例如在测试中),所以我需要多个所有者(因此是Rc)和运行时可变借用(因此是RefCount)。
我该如何实现?
【问题讨论】:
-
你的意思是
W同时实现了Clone和BorrowMut。所以<W: Clone + BorrowMut<Write>> -
RefCell::borrow_mut与BorrowMut特征无关。
标签: syntax rust traits type-bounds