2015-06-06 3 views
8

Ich baue gerade einen einfachen Interpreter für this language für die Praxis. Das einzige Problem, das es zu überwinden gilt, ist das Lesen eines einzelnen Bytes als Zeichen aus einer Benutzereingabe. Ich habe den folgenden Code so weit, aber ich brauche einen Weg, um die String zu drehen, dass die zweiten Leitungen machen in eine u8 oder einem anderen ganzen Zahl ist, die ich gegossen kann:Wie liest man ein einzelnes Zeichen aus der Eingabe als 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? 

Der Wert in Byte sollte ein u8, die ich kann eine i32 an anderer Stelle verwenden. Vielleicht gibt es einen einfacheren Weg dies zu tun, sonst werde ich jede Lösung verwenden, die funktioniert.

Antwort

9

Lesen nur ein Byte und Gießen es 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

Danke, ich benutzte .bytes() auf der Schnur und hatte Probleme, aber es stellte sich heraus, dass ich es falsch verwendete. Das funktioniert für mich, ich muss es einfach auspacken. – pengowen123

2

Zuerst müssen Sie Ihre Eingabe ändern, dann verwenden Sie bytes() anstelle von chars().

Bitte beachten Sie, dass Rust-Strings eine Sequenz von UTF-8-Codepunkten sind, die nicht unbedingt Byte-groß sind. Je nachdem, was Sie erreichen möchten, ist die Verwendung einer char die bessere Option.

+0

ich das versucht, aber es sagt, es ist eine i32 braucht. Ich habe .collect() auf der .bytes() verwendet, aber immer noch kein Glück. – pengowen123

+0

Ich denke, es ist idiomatischer, 'next()' anstelle von 'nth (0)' zu verwenden. Obwohl sie genau das Gleiche sind. –

+0

@VladimirMatveev Einverstanden, ich hatte den Code in der Antwort so geändert, dass es funktioniert (und ich habe die 'as i32'-Besetzung vergessen. Verdammt). – llogiq

Verwandte Themen