Size: a a a

Rust — русскоговорящее сообществo

2020 October 06

K

Kitsu in Rust — русскоговорящее сообществo
скрин стдлибы
источник

M

Mnwa in Rust — русскоговорящее сообществo
У трейта Into есть автоимплементация для трейтов From жеж
источник

r

red75prime in Rust — русскоговорящее сообществo
Kitsu
скрин стдлибы
Ещё есть impl AsRef<OsStr> for str . Значит выбирается impl<T: ?Sized + AsRef<OsStr>, '_> From<&'_ T> for PathBuf где T = str
источник

K

Kitsu in Rust — русскоговорящее сообществo
red75prime
Ещё есть impl AsRef<OsStr> for str . Значит выбирается impl<T: ?Sized + AsRef<OsStr>, '_> From<&'_ T> for PathBuf где T = str
Ах, вот оно что, спасибо. Ох уж эти кроличьи норы дерефов
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
А можно как-то красиво создать Result<T, Vec<E>> из итератора Result<T, E>?

Я пока придумал только с двуми флипами:

fn flip<L, R>(either: Result<L, R>) -> Result<R, L> {
   match either {
       Ok(l) => Err(l),
       Err(r) => Ok(r),
   }
}

flip(iter.map(flip).collect())
источник

K

Kitsu in Rust — русскоговорящее сообществo
вафель 🧇
А можно как-то красиво создать Result<T, Vec<E>> из итератора Result<T, E>?

Я пока придумал только с двуми флипами:

fn flip<L, R>(either: Result<L, R>) -> Result<R, L> {
   match either {
       Ok(l) => Err(l),
       Err(r) => Ok(r),
   }
}

flip(iter.map(flip).collect())
мб с unzip-ом как-нибудь выйдет?
источник

V

Vladimir in Rust — русскоговорящее сообществo
вафель 🧇
А можно как-то красиво создать Result<T, Vec<E>> из итератора Result<T, E>?

Я пока придумал только с двуми флипами:

fn flip<L, R>(either: Result<L, R>) -> Result<R, L> {
   match either {
       Ok(l) => Err(l),
       Err(r) => Ok(r),
   }
}

flip(iter.map(flip).collect())
А если будет больше чем один Ok(T) какое поведение ты хочешь?
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Не хочу
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
Vladimir
А если будет больше чем один Ok(T) какое поведение ты хочешь?
Вернуть первый.

Т.е.: ровно как с Result<_, _<_>>, но наоборот
источник

MF

Max Frai in Rust — русскоговорящее сообществo
Все еще не исправили проблему бесконечной компиляции с асинхронными функциями в последнем найтли
источник

BV

Boris Vinogradov in Rust — русскоговорящее сообществo
Max Frai
Все еще не исправили проблему бесконечной компиляции с асинхронными функциями в последнем найтли
не всё так быстро меняется - баги оптимизатора ещё вылезают, а ты хочешь чтобы у тебя генераторы кода работали безупречно
источник

АМ

Александр Мещеряков... in Rust — русскоговорящее сообществo
вафель 🧇
А можно как-то красиво создать Result<T, Vec<E>> из итератора Result<T, E>?

Я пока придумал только с двуми флипами:

fn flip<L, R>(either: Result<L, R>) -> Result<R, L> {
   match either {
       Ok(l) => Err(l),
       Err(r) => Ok(r),
   }
}

flip(iter.map(flip).collect())
Можно еще вот так извратиться:

[Err(1), Ok(2), Err(3)]
   .iter()
   .try_fold(vec![], |mut acc, x| x.map(Err).unwrap_or_else(|err| {
       acc.push(err);
       Ok(acc)
   }))
   .map(Err)
   .unwrap_or_else(Ok);

Странно что нет флипа в стандартном Result.
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Александр Мещеряков
Можно еще вот так извратиться:

[Err(1), Ok(2), Err(3)]
   .iter()
   .try_fold(vec![], |mut acc, x| x.map(Err).unwrap_or_else(|err| {
       acc.push(err);
       Ok(acc)
   }))
   .map(Err)
   .unwrap_or_else(Ok);

Странно что нет флипа в стандартном Result.
Потому что флип на Result  это семантически странно, это же не Either
источник

DS

David Sorokin in Rust — русскоговорящее сообществo
Mikail Bagishov
Потому что флип на Result  это семантически странно, это же не Either
По факту это Either и есть, приправленный синтаксическим сахаром. Это безотносительно обсуждаемого куска кода.
источник

АМ

Александр Мещеряков... in Rust — русскоговорящее сообществo
@WaffleLapkin Еще вариант все того же:

[Err(1), Ok(2), Err(3)]
   .iter()
   .map(|x| x.map(Err).unwrap_or_else(Ok))
   .collect::<Result<Vec<_>, _>>()
   .map(Err)
   .unwrap_or_else(Ok);


Роль флипа выполняет x.map(Err).unwrap_or_else(Ok).
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
Ужас какой :D
источник

АМ

Александр Мещеряков... in Rust — русскоговорящее сообществo
Ну так выглядит вроде прилично:

iter
   .map(|x| x.map(Err).unwrap_or_else(Ok))
   .collect()
   .map(Err)
   .unwrap_or_else(Ok)


Если из контекста понятно, что там за типы.
источник

АМ

Александр Мещеряков... in Rust — русскоговорящее сообществo
Хотя нет, с collect это не прокатит.
источник

L

Lain-dono in Rust — русскоговорящее сообществo
вафель 🧇
Вернуть первый.

Т.е.: ровно как с Result<_, _<_>>, но наоборот
А тогда надо в Result<Vec<_>, E>
источник

L

Lain-dono in Rust — русскоговорящее сообществo
вафель 🧇
Вернуть первый.

Т.е.: ровно как с Result<_, _<_>>, но наоборот
Вот что говорит дока на этот счёт
источник