Что это за разворот: иногда он разворачивает иногда это unwrap_or

Примечание. Специфика данного вопроса относительно read_line и ~str относится к версии ржавчины до версии 1.0. Общие понятия о unwrap и unwrap_or остаются актуальными.

Я столкнулся с этим при чтении Rust для Rubyists i.e.:

let mut reader = BufferedReader::new(io::stdin());
let input = reader.read_line().unwrap_or(~"nothing");

Ответ 1

Примечание. Специфика в этом ответе относительно read_line и ~str относится к версии Rust до версии 1.0. Общие понятия о unwrap и unwrap_or остаются актуальными.

Поскольку read_line может завершиться ошибкой, он возвращает Option<~str>. Чтобы получить значение, вы можете использовать сопоставление шаблонов или один из методов разворота.

Разница между unwrap и unwrap_or заключается в том, что unwrap завершится с ошибкой, если нет значения (None), но unwrap_or вернет указанное значение по умолчанию ( "ничего" в этом случае)

Ответ 2

Примечание. Специфика в этом ответе относительно read_line и ~str относится к версии Rust до версии 1.0. Общие понятия о unwrap и unwrap_or остаются актуальными.

У Rust есть документация по API, которая объясняет эти вещи.

BufferedReader.read_line:

fn read_line(&mut self) -> Option<~str>

Считывает следующую строку ввода, интерпретированную как последовательность кодированных кодов Unicode кодированных UTF-8. Если встречается новая строка, то новая строка содержится в возвращаемой строке.

     

...

     

[Тогда что-то о повышении условия io_error, которое является одной ситуацией, в которой она вернет None, если будет обработано условие. Если это не так, это не сработает, и вы никогда ничего не получите.]

Вы также получите None, если все прочитано в читателе.


Option.unwrap:

fn unwrap(self) -> T

Выводит значение из типа параметра и возвращает его.

     

Полезно в первую очередь для получения строк, векторов и уникальных указателей из типов параметров без их копирования.

     

...

То есть

  • Some(a).unwrap() возвращает a
  • None.unwrap() не работает

Option.unwrap_or:

fn unwrap_or(self, def: T) -> T

Возвращает содержащееся значение или значение по умолчанию

То есть

  • Some(a).unwrap_or(b) возвращает a
  • None.unwrap_or(b) возвращает b