VDS за 300р от нашего партнера SpaceWeb
[120]
27 Ноя 2019, 23:24

Советы по Rust: типы Result

Ожидание определенных выводов от Result

Почему  Option.expect(M) , а не Result.expect(M) ?

Я открыл запрос на извлечение, который вставил это, и выясняется, почему нет функции expect потому что вы намереваетесь использовать состав:

Этот метод не обязательно должен быть с опцией adapters — res.ok ().
Expect() делает именно то, что должен делать этот метод.

Как написать следующий Rust, чтобы ожидать успеха:

let my_value = this_might_fail().ok().expect("It failed :(");

И это чтобы ожидать неудачного результата:

let my_value = this_might_succeed().err().expect("It succeeded :(");

Использование результата как собственной ошибки

Если Result содержит Err(M) , то почему нет метода, который гарантирует, что у вас Ok(T) и в противном случае происходит сбой?

Представьте, что у меня есть некоторый код, который вызывает внешнюю библиотеку и возвращает дескриптор в случае успеха или строку ошибки при сбое. Теперь я хочу получить этот дескриптор и потерпеть неудачу, если мы не были готовы его получить. В случае неудачи я хочу, чтобы причина неудачи была известна, чтобы мы могли видеть, что пошло не так. Вот наши требования:

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

  • Полезное сообщение об ошибке при сбое.

Вот некоторый код Rust, который воплощает этот вариант использования:

let main_window = sdl::Window::create( ... ).unwrap(); // (1)
main_window.be_awesome();
  1. Это не сработает, но мы получим общее сообщение об ошибке. Несмотря на то, что create выдает конкретное сообщение об ошибке, почему оно не удалось, об этом не сообщается при сбое задачи.

unwrap проверяет, что результат в Ok и в противном случае Ok ошибки; это то, что я хочу, но вместо значения Err общее сообщение об ошибке. Это имеет синтаксис, который мы хотим, но не соответствует второму требованию.

В соответствии с запросом pull из ранее, эта функциональность фактически unwrap функции unwrap :

Метод ожидаемого ранее не существовал в типе результата из-за сообщения об ошибке (значение ошибки). В прошлом значение ошибки было привязано к ToStr, поэтому хорошее сообщение могло быть частью развертки, но, похоже, оно ушло.

К счастью, Rust — потрясающий язык, и мы можем реализовать наш собственный способ сделать это «без изменения стандартной библиотеки».

 Написание наших пользовательских ожиданий с использованием трейтов

Сначала нам нужно обозначить трейт, который определяет нашу собственную версию unwrap . Мы изменим будущий API в нашем примере.

 trait GetWithFailMessaged <T> {
 fn getM ( self ) -> T;
 } 

Мы создали «общий трейт», ​​что означает, что он может применяться к «всему, что возвращает элемент данного типа». Далее нам нужно сделать «реализацию» нашего трейта для типов результатов:

impl<T,E:Any+Send> GetWithFailMessaged<T> for Result<T,E> {
	fn getM(self) -> T {
		match self {
			Ok(a) => a,
			Err(b) => fail!(b)
		}
	}
}

То, что мы сделали, — это реализация, которая применяется к любому Result пока объект ошибки доступен для отправки. Поскольку нам интересны строки как ошибки, а строки могут быть Send , то применим любой результат, который имеет место в поле. Теперь мы можем просто использовать getM :

let x = this_might_fail().getM();

Который выполняет то же действие, что и unwrap [std] , но выдает ошибку, сохраненную в результате, а не общую ошибку.

trait GetWithFailMessaged<T> {
    fn getM(self) -> T;
}

impl<T,E:Any+Send> GetWithFailMessaged<T> for Result<T,E> {
    fn getM(self) -> T {
        match self {
            Ok(a) => a,
            Err(b) => fail!(b)
        }
    }
}

fn this_might_fail() -> Result<int, ~str> {
    Err(~"Oh no.")
}

fn main() {
    let _x = this_might_fail().getM();
}



Это первый выпуск Rust Tips
Продолжение следует!

Комментарии (0)

Добавить комментарий

Войдите, чтобы написать о чем-нибудь...
Вход Регистрация
Web.onRails
Здесь вы можете спросить или написать обо всём, что касается Веб-разработки.
написать о чем-нибудь...
Метки:
Лучшее
[4]
10 Окт 2018, 15:33
Как запретить просмотр сайта по IP?
[просмотров 6748]
[52]
16 Окт 2011, 15:38
Вывести все элементы POST
[просмотров 4509]
[120]
21 Июл 2011, 14:04
Python Imaging Library (PIL)
[просмотров 4491]
[74]
31 мая 2011, 11:48
Python проверка существования переменной
[просмотров 4299]
[100]
19 Дек 2014, 16:16
User-agent для Internet Explorer 11
[просмотров 3626]
[315]
16 Июл 2011, 20:03
Python работа с MySQL
[просмотров 3580]
[58]
29 мая 2012, 12:08
Узнать версию PHP из командной строки
[просмотров 3564]
[1]
13 Фев 2019, 14:23
Как получить значение CSS в javascript
[просмотров 3407]

Вести с Хабра