Обновлено для Rust 1.x
Вы можете сделать что-то вроде этого:
use std::io::{self, BufRead}; // (a)
fn main() {
let reader = io::stdin();
let numbers: Vec =
reader.lock() // (0)
.lines().next().unwrap().unwrap() // (1)
.split(' ').map(|s| s.trim()) // (2)
.filter(|s| !s.is_empty()) // (3)
.map(|s| s.parse().unwrap()) // (4)
.collect(); // (5)
println!("{:?}", numbers);
}
Сначала мы берем блокировку stdin, которая позволяет работать с stdin как (по умолчанию stdin в Rust не загружен, вам нужно вызвать метод lock()
для получения буферизованной версии, но эта буферизованная версия является только одной для всех потоков в вашей программе, следовательно, доступ к ней должен быть синхронизированы).
Далее мы читаем следующую строку (1); Я использую lines()
-тератор, метод next()
возвращает Option
, поэтому для получения только String
вам нужно unwrap()
дважды.
Затем мы разбиваем его на пробелы и обрезаем результирующие куски из дополнительных пробелов (2) удалите пустые куски, оставшиеся после обрезки (3), преобразуйте строки в i32
s (4) и соберите результат с вектором (5).
Нам также понадобятся для импорта std::io::BufRead
признака (a) для использования метода lines()
.
Если вы заранее знаете, что ваш ввод не будет содержать более одного пробела между цифрами, вы можете опустить шаг (3 ) и переместите вызов trim()
из (2) в (1):
let numbers: Vec =
reader.lock()
.lines().next().unwrap().unwrap()
.trim().split(' ')
.map(|s| s.parse().unwrap())
.collect();
Обновить
Однако ржавчина уже предлагает метод разделения строки на последовательность слова split_whitespace()
:
let numbers: Vec =
reader.read_line().unwrap().as_slice()
.split_whitespace()
.map(|s| s.parse().unwrap())
.collect()
split_whitespace()
на самом деле представляют собой комбинацию split()
и filter()
, как и в моем оригинале пример. Он использует функцию в аргументе split()
, которая проверяет разные типы пробелов, а не только пробельные символы. Вы можете найти его источник здесь .