2015-05-20 21 views

risposta

19

Ed ecco una versione con tutte le annotazioni di tipo opzionale e la gestione degli errori, che è forse utile per i principianti (come me):

use std::io; 

fn main() {  
    let mut input_text = String::new(); 
    io::stdin() 
     .read_line(&mut input_text) 
     .expect("failed to read from stdin"); 

    let trimmed = input_text.trim(); 
    match trimmed.parse::<u32>() { 
     Ok(i) => println!("your integer input: {}", i), 
     Err(..) => println!("this was not an integer: {}", trimmed) 
    }; 
} 
6

Probabilmente la parte più semplice sarebbe quella di utilizzare text_io e scrivere:

// read until a whitespace and try to convert what was read into an i32 
    let i: i32 = read!(); 

Nota: Tuttavia, se avete bisogno di leggere più di un valore allo stesso tempo, potrebbe essere necessario la ruggine notte.

+0

Penso che funzioni su stable se hai solo bisogno di leggere un valore alla volta. –

+0

'text_io' dev qui. @VladimirMatveev ha ragione, 'text_io' gira su stable se non si leggono tuple ma solo un singolo valore per' read!() 'Invocation. In realtà richiede notte per più valori. Aggiornerò la descrizione github. –

4

parse è più o meno lo stesso; è read_line che è spiacevole ora.

use std::io; 

fn main() { 
    let mut s = String::new(); 
    io::stdin().read_line(&mut s).unwrap(); 

    match s.trim_right().parse::<i32>() { 
     Ok(i) => println!("{} + 5 = {}", i, i + 5), 
     Err(_) => println!("Invalid number."), 
    } 
} 
3

Ecco alcune possibilità (Rust 1,7):

use std::io; 

fn main() { 
    let mut n = String::new(); 
    io::stdin() 
     .read_line(&mut n) 
     .expect("failed to read input."); 
    let n: i32 = n.trim().parse().expect("invalid input"); 
    println!("{:?}", n); 

    let mut n = String::new(); 
    io::stdin() 
     .read_line(&mut n) 
     .expect("failed to read input."); 
    let n = n.trim().parse::<i32>().expect("invalid input"); 
    println!("{:?}", n); 

    let mut n = String::new(); 
    io::stdin() 
     .read_line(&mut n) 
     .expect("failed to read input."); 
    if let Ok(n) = n.trim().parse::<i32>() { 
     println!("{:?}", n); 
    } 
} 

Questi ti risparmiano la cerimonia della corrispondenza del modello senza dipendere da librerie aggiuntive.

+0

Andiamo, è chiaramente diverso, e una risposta completa rende più facile per il lettore. – qed

+0

Mi sembra piuttosto identico a [la risposta accettata] (http://stackoverflow.com/a/30355925/155423). – Shepmaster

+0

Sì, devi ottenere una stringa da parte dell'utente e memorizzarla in una variabile, quella parte è la stessa. La parte di parsing è più concisa, come spiegato nella mia risposta. – qed