私は一連の質問を連続して聞くことができるPromptSet
を構築しています。テスト上の理由から、stdin & stdoutを直接使用する代わりに、リーダーとライターを渡すことができます。コンストラクタの標準入力と出力を使用して、構築する構造体が存続する限り存続する方法はありますか?
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はかなり特殊なケースであるため、重複はしません。 –