2015-06-06 7 views
8

Attualmente sto costruendo un semplice interprete per lo studio this language. L'unico problema rimasto da superare è la lettura di un singolo byte come carattere dall'input dell'utente. Ho il seguente codice finora, ma ho bisogno di un modo per trasformare il String che le seconde linee fa in un u8 o un altro numero intero che può lanciare:Come leggere un singolo carattere dall'input come u8?

let input = String::new() 
let string = std::io::stdin().read_line(&mut input).ok().expect("Failed to read line"); 
let bytes = string.chars().nth(0) // Turn this to byte? 

Il valore in byte dovrebbe essere un u8 che ho può trasmettere a un i32 da utilizzare altrove. Forse c'è un modo più semplice per farlo, altrimenti userò qualsiasi soluzione che funzioni.

risposta

9

lettura solo un byte e il cast a i32:

use std::io::Read; 

let input: Option<i32> = std::io::stdin() 
    .bytes() 
    .next() 
    .and_then(|result| result.ok()) 
    .map(|byte| byte as i32); 

println!("{:?}", input); 
+0

Grazie, stavo usando .bytes() sulla stringa e avendo problemi, ma risulta che stavo usando male. Questo funziona per me, devo solo scartarlo. – pengowen123

2

Innanzitutto, rendere l'input modificabile, quindi utilizzare bytes() anziché chars().

let mut input = String::new(); 
let string = std::io::stdin().read_line(&mut input).ok().expect("Failed to read line"); 
let bytes = input.bytes().nth(0).expect("no byte read"); 

Si prega di notare che le stringhe di ruggine sono una sequenza di caratteri UTF-8 codepoints, che non sono necessariamente di byte dimensioni. A seconda di cosa stai cercando di ottenere, l'utilizzo di un char potrebbe essere l'opzione migliore.

+0

Ho provato questo, ma si dice che ha bisogno di un i32. Ho usato .collect() su .bytes() ma ancora senza fortuna. – pengowen123

+0

Penso che sia più idiomatico usare 'next()' invece di 'nth (0)'. Sebbene siano esattamente la stessa cosa –

+0

@VladimirMatveev D'accordo, avevo modificato il codice dato nella risposta quel tanto che basta per farlo funzionare (e ho dimenticato il cast di 'come i32'. – llogiq

Problemi correlati