Получение вложенных значений в Immutable.js

Обновлено для 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(), которая проверяет разные типы пробелов, а не только пробельные символы. Вы можете найти его источник здесь .

29
задан xiankai 25 November 2015 в 07:00
поделиться