注この質問のコードは、1.0より前のバージョンのRustに関連していますが、回答はRust 1.0用に更新されています。
文字列を整数に変換するのに問題があります。
fn main() {
let input_text = io::stdin()
.read_line()
.ok()
.expect("failed to read line");
let input: Option<int> = from_str(input_text.as_slice());
println!("{}", input);
}
コンソールに数値(たとえば42)を入力すると、プログラムはNone
を出力します。
ドキュメントによると これは文字列の形式が正しくない場合の通常の状況ですが、私の42
の何が問題になっていますか?
str::parse()
を呼び出すことができますが、_read_line
_が機能していることを確認する必要があります。リーダーが必要です:
_use std::io;
fn main() {
let reader = io::stdin();
}
_
stdin
入力ストリームを処理するグローバルバッファを読み取り、 BufRead
トレイトを実装します _read_line
_メソッド メソッド。これは、可変のString
を入力バッファーとして受け取り、改行バイトに到達するまでストリームからすべてのバイトを読み取り、それらをバッファーに追加します。 #expect()
メソッドはResult
をアンラップします。 Err
の場合、メッセージと原因でパニックになります。
_use std::io;
fn main() {
let reader = io::stdin();
let mut input_text = String::new();
reader.read_line(&mut input_text).expect("failed to read line");
}
_
これで、_i32
_に変換する入力テキストができました。これは、解析する型を指定する限り、str::parse()
が機能する場所です。 str::trim()
_read_line
_にはバッファに改行バイトが含まれているため、必要です
_use std::io;
fn main() {
let reader = io::stdin();
let mut input_text = String::new();
reader.read_line(&mut input_text).expect("failed to read line");
let input = input_text.trim().parse::<i32>();
}
_
まだ完了していませんが、パターンマッチングを使用して入力を正常に解析したことを確認する必要があります。元の入力バッファを使用可能な整数に変換するために必要なすべてのコードは次のとおりです。
_use std::io;
fn main() {
let reader = io::stdin();
let mut input_text = String::new();
reader.read_line(&mut input_text).expect("failed to read line");
let input_opt = input_text.trim().parse::<i32>();
let input_int = match input_opt {
Ok(input_int) => input_int,
Err(e) => {
println!("please input a number ({})", e);
return;
}
};
println!("{}", input_int);
}
_
これはエラーや警告なしでコンパイルされます。
_read_line
_ のドキュメントで説明されているように、入力の最後に改行が含まれます。これにより、from_str()
が失敗します。 std::str::trim()
を使用してこれを変更する:
_let input: Result<i32, _> = input_text.parse();
_
これに:
_let input: Result<i32, _> = input_text.trim().parse();
_
うまくいくようです。
Rust 1.14、 Rustプログラミング言語この例 :
let guess: u32 = guess.trim().parse()
.expect("Please type a number!");
同じ変数名を再度使用することもでき、新しいタイプは古いタイプを「シャドウ」します。
use std::io;
fn main() {
let mut input_text = String::new();
io::stdin()
.read_line(&mut input_text)
.expect("failed to read line");
let input: u32 = input_text.trim().parse()
.expect("Please type a number!");
}
これを試して:
fn main() {
let input_text = std::old_io::stdin()
.read_line()
.ok()
.expect("failed to read line");
let input_number: Option<i32> = input_text.trim().parse().ok();
let number = match input_number{
Some(num) => num,
None => {
println!("Wrong input data! Input a number.");
return;
}
};
println!("{}", number);
}