Примечание. Специфика данного вопроса относительно 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