我正在構建一個可以連續詢問一系列問題的PromptSet
。出於測試原因,它允許您直接傳遞讀寫器,而不是直接使用stdin &標準輸出。有沒有一種方法可以在構造函數中使用標準輸入和輸出,只要你正在構造的結構體一直存在?
由於stdin和stdout是常見用例,我想創建一個默認的「構造函數」,允許用戶在不需要任何參數的情況下生成PromptSet<StdinLock, StdoutLock>
。這裏是到目前爲止的代碼:
use std::io::{self, BufRead, StdinLock, StdoutLock, Write};
pub struct PromptSet<R, W>
where
R: BufRead,
W: Write,
{
pub reader: R,
pub writer: W,
}
impl<R, W> PromptSet<R, W>
where
R: BufRead,
W: Write,
{
pub fn new(reader: R, writer: W) -> PromptSet<R, W> {
return PromptSet {
reader: reader,
writer: writer,
};
}
pub fn default<'a>() -> PromptSet<StdinLock<'a>, StdoutLock<'a>> {
let stdin = io::stdin();
let stdout = io::stdout();
return PromptSet {
reader: stdin.lock(),
writer: stdout.lock(),
};
}
pub fn prompt(&mut self, question: &str) -> String {
let mut input = String::new();
write!(self.writer, "{}: ", question).unwrap();
self.writer.flush().unwrap();
self.reader.read_line(&mut input).unwrap();
return input.trim().to_string();
}
}
fn main() {}
StdinLock
和StdoutLock
都需要聲明的壽命。爲了使它複雜化,我認爲最初的stdin()
/stdout()
句柄需要至少與鎖一樣長。我希望參考StdinLock
和StdoutLock
只要我的PromptSet
能夠生活,但無論我嘗試什麼,我都無法使其工作。這裏是我不斷收到錯誤:
error[E0597]: `stdin` does not live long enough
--> src/main.rs:30:21
|
30 | reader: stdin.lock(),
| ^^^^^ borrowed value does not live long enough
...
33 | }
| - borrowed value only lives until here
|
note: borrowed value must be valid for the lifetime 'a as defined on the method body at 25:5...
--> src/main.rs:25:5
|
25 |/ pub fn default<'a>() -> PromptSet<StdinLock<'a>, StdoutLock<'a>> {
26 | | let stdin = io::stdin();
27 | | let stdout = io::stdout();
28 | |
... |
32 | | };
33 | | }
| |_____^
error[E0597]: `stdout` does not live long enough
--> src/main.rs:31:21
|
31 | writer: stdout.lock(),
| ^^^^^^ borrowed value does not live long enough
32 | };
33 | }
| - borrowed value only lives until here
|
note: borrowed value must be valid for the lifetime 'a as defined on the method body at 25:5...
--> src/main.rs:25:5
|
25 |/ pub fn default<'a>() -> PromptSet<StdinLock<'a>, StdoutLock<'a>> {
26 | | let stdin = io::stdin();
27 | | let stdout = io::stdout();
28 | |
... |
32 | | };
33 | | }
| |_____^
這是完全有可能我就是不明白,壽命或別的超級基本的概念。
[有沒有辦法恢復到一個函數創建一個變量的引用?](http://stackoverflow.com/q/32682876/155423) – Shepmaster
如果問題被改寫到標準輸入/輸出它的不是重複的,因爲stdin/stdout是一個相當特殊的情況。 –