stdinで文字を繰り返し処理しようとしています。 Read.chars()
メソッドはこの目標を達成しますが、不安定です。明らかな代替方法は、をflat_map
とし、それを文字イテレータに変換することです。.chars()を使用した.flat_map()がstd :: io :: Linesでは動作しないのはなぜですか?Stringのベクトルではどうなりますか?
これはうまくいくはずですが、そうでないと、borrowed value does not live long enough
というエラーが発生します。
use std::io::BufRead;
fn main() {
let stdin = std::io::stdin();
let mut lines = stdin.lock().lines();
let mut chars = lines.flat_map(|x| x.unwrap().chars());
}
これはRead file character-by-character in Rustで述べたが、それは本当に理由を説明does'tされます。
特に私が混乱しているのは、を使用して文字列のベクトルに適用するdocumentation for flat_map
の例とどのように違うかです。私はそれがどのように異なっているべきかを本当に見ていない。私が見る主な違いは、どちらかの私のコードは、同様unwrap()
を呼び出す必要があるということですが、次のように最後の行を変更することはできません:
let mut chars = lines.map(|x| x.unwrap());
let mut chars = chars.flat_map(|x| x.chars());
それは二行目で失敗したので、問題は表示されません。 unwrap
となります。
なぜこの最後の行が機能しないのですか?ドキュメントの似たような行はなぜですか?これを動作させる方法はありますか?クロージャの変数の型が何であるかを考え出すことで
ああ、私は、感謝を参照してください!私が混乱していたのは、 '&str'ではなく' String'で関数がすべて処理されているということです。値を動かす必要があるようです。しかし、クロージャが実際の値を返すのではなく、遅れて評価されるイテレータと、それらのイテレータが元のオブジェクトへの参照を含むので、そうではありません。 –
@ IanD.Scott '文字列'に対して 'chars'を呼び出すことができますが、'&self'(参照)を受け取り、実際に 'Deref'を介して実装されていることに注意してください。したがって、 '&self' =>'&str'です。 – Shepmaster
変数型を決定するための 'let()= x;'トリックをありがとう! –