2014-09-02 1 views
1

Я недавно научился читать ввод с использованием io из документации по ржавчине, но мне интересно, есть ли какой-либо метод «простой» для чтения в консольном вводе. Мои корни сильно вырыты на C++, поэтому захват ввода с консоли так же просто, как и std::cin >> var. Но ржавчина я делаю:Чтение пользовательского ввода с консоли однажды эффективно

for line in io::stdin().lines() { 
    print!("{}", line.unwrap()); 
    break; 
} 

это читает ввод один раз, но цикл кажется очень неуклюжим способом, чтобы достичь этого. Как я могу это сделать?

ответ

4

io::stdin() Фактически BufferedReader<> обертывание stdin. Как видите, in the docs, BufferedReader дает множество способов извлечения контента.

Вы именно:

fn read_line(&mut self) -> IoResult<String> 

, который будет пытаться читать строки из стандартного ввода (и, возможно, возвращает ошибку). Простой код для считывания int из стандартного ввода будет:

let a: int = from_str(io::stdin().read_line().unwrap().as_slice()).unwrap() 

но не любой обработки ошибок и легко может потерпеть неудачу.

Более явный подход может потребовать от вас обращаться с вещами более аккуратно:

let a: int = match from_str(
    match io::stdin().read_line() { 
     Ok(txt) => txt, // Return the slice from_str(...) expects 
     Err(e) => { /* there was an I/O Error, details are in e */ } 
    }.as_slice()) /* match from_str(...) */ { 
     Some(i) => i, // return the int to be stored in a 
     None => { /* user input could not be parsed as an int */ } 
    }; 
+0

Rust сообщает мне, что 'txt' не живет достаточно долго, чтобы его можно было сопоставить в следующем блоке на вашей второй реализации, как я могу пройти мимо этого? –

+0

Не считайте фиксированным, as_slice() необходимо перенести в конец первого оператора соответствия –

+0

@SyntacticFructose О да, действительно, хороший улов! Я исправлю это. – Levans

4

std::io::stdin()BufferedReader<StdReader> и BufferedReader инвентарь Buffer признак. Это означает, что вы можете вызвать метод read_line() на нем:

match io::stdin().read_line() { 
    Ok(line) => // do whatever you want, line is String 
    Err(e) => // handle error, e is IoError 
} 

Если вы хотите прочитать несколько строк, это, вероятно, лучше, чтобы сохранить io::stdin() результат в переменный первом.

+0

В настоящее время * read_line * функция ожидает один параметр, изменяемый ссылку на * Строка *. Для получения дополнительной информации нажмите [здесь] (https://doc.rust-lang.org/std/io/struct.Stdin.html#method.read_line). – freinn

 Смежные вопросы

  • Нет связанных вопросов^_^