È possibile chiamare str::parse()
, ma è necessario fare in modo che read_line
sta lavorando. Abbiamo bisogno di un lettore:
use std::io;
fn main() {
let reader = io::stdin();
}
stdin
legge il buffer globale che gestisce il flusso di input e anche implementa il BufRead
tratto che ha il metodo read_line
method. Questo accetta un String
mutabile come buffer di input e legge tutti i byte dal flusso finché non viene raggiunto un nuovo byte e li aggiunge al buffer. Il metodo #expect()
srotola lo Result
; se è un Err
verrà messo in panico con il messaggio e la causa.
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");
}
ora abbiamo il testo di input che vogliamo convertire in un i32
. Questo è dove str::parse()
funzionerà per noi, a patto che gli diamo un tipo da analizzare. str::trim()
è necessario perché read_line
include il byte a capo del buffer
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>();
}
Noi non abbiamo ancora finito, abbiamo ancora bisogno di assicurare che abbiamo analizzato con successo l'ingresso utilizzando pattern matching. Tutto il codice è necessario convertire il buffer di input originale in un intero utilizzabile è:
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);
}
Questo compila senza errori o avvisi.
Questa risposta indica il modulo 'old_io', che non è disponibile in Rust 1.0; questa risposta non è più utile. – Shepmaster