Обновлено для Rust 1.x
Вы можете сделать что-то вроде этого:
use std::io::{self, BufRead}; // (a)
fn main() {
let reader = io::stdin();
let numbers: Vec<i32> =
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<io::Result<String>>
, поэтому для получения всего String
вам нужно unwrap()
дважды.
Затем мы разделим его на пробелы и обрезаем результирующие куски из дополнительных пробелов (2), удалим пустые куски, оставшиеся после обрезки (3), преобразуем строки в i32
s (4) и соберите результат с вектором (5).
Для использования метода нам также необходимо импортировать std::io::BufRead
признак (a).
Если вы заранее знаете, что ваш вход не будет содержать более чем один пробел между числами, вы можете пропустить шаг (3) и переместить trim()
вызова из (2) в (1):
let numbers: Vec<i32> =
reader.lock()
.lines().next().unwrap().unwrap()
.trim().split(' ')
.map(|s| s.parse().unwrap())
.collect();
Обновление
ржавчины, однако, уже предоставляет способ для разбиения строки в последовательность пробельных разделенных слов, называется split_whitespace()
:
let numbers: Vec<i32> =
reader.read_line().unwrap().as_slice()
.split_whitespace()
.map(|s| s.parse().unwrap())
.collect()
split_whitespace()
фактически представляет собой комбинацию split()
и filter()
, как и в моем оригинальном примере. Он использует функцию в аргументе split()
, хотя он проверяет разные типы пробелов, а не только символы пробела. Вы можете найти его источник: here.
Спасибо, Владимир, ты спас день. На стороне примечания, ничего себе, Ржавчина действительно интенсивна! –
Существует также способ использовать регулярные выражения для разделения произвольными пробелами. Вероятно, это даст код terser, но для этого требуется использование нестандартных ящиков (хотя он включен в дистрибутив). Пример [здесь] (http://doc.rust-lang.org/regex/enum.Regex.html#method.split) - это почти то, что вы хотите. –
Вы также можете использовать ['.words()'] (http://doc.rust-lang.org/nightly/std/str/trait.UnicodeStrSlice.html#tymethod.words) (немного более общий, чем просто пробелы , хоть). – huon