Anton
Это пример для быстрых тестов
I
или ша дуе или match
что такое ша дуе?
I
а там же вроде можно Option<>.is_none() как-то так проверить
Anton
Промахнулся
I
а ну и нет причных i++ и if (Option<>.is_none()) { }
Anton
Скобкив if не нужны
Anton
Во всех примерах часто опускается проверка ошибок, везде unwrap
Anton
Иногда try и ?
I
Иногда try и ?
вот тоже сколько пытался сделать с ? и все время ругался компилятор
Anton
? Можно юзать внутри функции возвращающей Result
Anton
Тип ошибок должен или совпадать или описан способ конвертирования
I
так, пока сложно, я потом прочитаю еще раз
Anton
fn a() -> Result<Data,String>
I
А ну и вот кстати да, с ошибками не понятно. Хотел тогда сделать кастомные ошибки, так пришлось 3 трейта реализовывать. Error, Print и еще что-то
I
Debug
Anton
fn b() -> Result<Data,String> { a()? }
Anton
Debug
Добавь #[derive(Debug)]
Anton
Он тебе сам лебаг реализует
Anton
Перед структурой
I
Добавлял, но приходилось еще делать реализацию вывода
I
по урокам делал
I
может старые, хз
Anton
Принт {} выводит строку
Anton
Выводить дебаг через {:?}
Anton
{:#?} Красово вывести
I
да не, это я всё знаю
I
у меня часто проблемы с заимствованием возникали, просто не понимал как уследить где мут, где не мут
Anton
Компилятор тебе пишет почти прямым текстом
I
Не похоже что ты разобрался
ну так и не разобрался. Думаю сейчас по ходу работы начну понимать как это делается всё
Anton
https://play.rust-lang.org/?gist=3f26c881d416d6433fb2abb67548eacd&version=stable
Anton
https://play.rust-lang.org/?gist=9625f3f875a557c20c71a4269643f15b&version=stable
I
не могу понять почему println!("Baz: {:#?}", a(false)?); не пишет Baz: Failed ...
Anton
там вконце ?
Anton
если будет ошибка она перейдет в Result<(),String>
I
ну и получается ? Возращает Err из функции try_a_fail?
Anton
не совсем
I
Вот как это вижу я. try_a_fail() возвращает Ok(()), но в if let Err(e) = try_a_fail() срабатывает. Вот такие моменты ставят меня в ступор
Anton
не могу понять почему println!("Baz: {:#?}", a(false)?); не пишет Baz: Failed ...
Равнозначно let tmp = a(true); match tmp { Ok(val_from_a) => println!("Baz: {:#?}", val_from_a), Err(err_from_a) => { return Err(err_from_a) } }
Anton
Если вернуло не ошибку распечатать, если ошибку, самому завершится с ошибкой
I
воот. то есть все-таки ? возвращает результат и не продолжает выполнять функцию
Loyd
Рассказ о том, как я ворую номера кредиток и пароли у посетителей ваших сайтов / Хабрахабр https://m.habrahabr.ru/company/ruvds/blog/346442/#habracut
Anton
воот. то есть все-таки ? возвращает результат и не продолжает выполнять функцию
если функция после которой стоит ? возвращает ошибку - он прерывает выполнение после этого символа и передает ошибку дальше, если ошибки не было работает далььше
Anton
fn a(param: bool) -> Result<Baz, String> { if param { Ok(Baz {foo: String::from("abc"), bar: 123}) } else { Err(String::from("Failed: param is false")) } }
Anton
На входе param булевый
Anton
если он true - функция возвращает ок
Anton
иначе ошибку
Anton
fn try_a_fail() -> Result<(), String> { println!("Baz: {:#?}", a(false)?); Ok(()) }
Anton
функция вызывает a(false)
Anton
то есть всегда ошибка и до Ok(()) просто не дойдет
I
то есть всегда ошибка и до Ok(()) просто не дойдет
во, вот я так и понял. Сейчас попробую сам с нуля написать не подсматривая
I
спасибо
Anton
https://play.rust-lang.org/?gist=c71b3b51c50f7d287d191ebab8bab2d3&version=stable
Anton
Тебя наверно путает что вконце функций в расте return не обязательный
Anton
Если после параметра в конце функции нет точки с запятой - то это return
I
а вот как получить значение Err в переменную
I
допустим есть однотипный Result<String, String>. Можно ли получить один из стрингов в переменную?
I
https://play.rust-lang.org/?gist=e885343b7acb84b3aa8a6ff3a5b43b33&version=stable
I
вот я так пробовал
I
тут по ходу только match поможет
Anton
if let Err(var_for_e) = fail(true) { println!("Fail {:}", var_for_e); }
I
понял, просто думал можно сделать кратко
I
не могу отучить себя писать супер кратко
Anton
В том то и прикол раст заставит тебя обрабатывать ошибки
Anton
напишешь match и считай ошибки обработал
I
это даже плюс, потом что я часто забиваю на это и потом долго отлаживаю и не могу найти где падает
I
возможно это даже будет красивее чем try {} catch {}
I
и компактнее
Anton
Ну у тебя ошибка может быть енум
I
вот я так и начинал делать енумами, потом делал возвращаемое значение Result<Data, MyEnumErrorType>
I
точно вспомнил в чем беда у меня была
I
в енум же нельзя назначить значение String
I
Я пытался делать enum Errors { ADDR_IN_USE = "Address in use", PORT_IN_USE = "Port in use" }
I
А, так оказывается можно
Anton
https://play.rust-lang.org/?gist=e885343b7acb84b3aa8a6ff3a5b43b33&version=stable
Anton
Лучше избегай стрингов без надобности