ошибку конвертировать std::io::Error попроще. Конвертация std::convert::From для псевдонима типа (мой Result с кастомной ошибкой) недоступна, а From<std::io::Error> for MyError тоже не работает: условный
fn f(..) -> MyResult {
write_all(..).map_err(|e| e.into())?
}
ругается на type annotation needed для замыкания
мне казалось, .map_err(|e| e.into()) вопросик сам делает 🤔
Надо код, что-то непонятное. Должно работать. Ну и глянь крейт thiserror : https://crates.io/crates/thiserror Он делает весь бойлерплейт для возможности конвертации ошибок, как раз для подобных случаев.
если будет понятнее ``` #[derive(Debug)] enum WalError { IoError(std::io::Error), } impl std::fmt::Display for WalError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "WAL-error") } } impl std::error::Error for WalError { fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { match &self { WalError::IoError(io_error) => Some(io_error), } } } impl From<std::io::Error> for WalError { fn from(err: std::io::Error) -> Self { WalError::IoError(err) } } type WalResult<T> = Result<T, WalError>; struct Block { ... } impl Block { ... fn write_flags (&self, file: &mut std::fs::File) -> WalResult<()> { file.seek( std::io::SeekFrom::Start(self.starting_pos) ).map_err(|e| e.into())?; file.write_all(&self.flags.to_le_bytes()).map_err(|e| e.into())?; file.sync_all().map_err(|e| e.into())?; Ok(()) } ... } ```
попробуй thiserror
Сложно по чистому коду что-то сказать, когда типы переменных не ясны. Единственное, что кажется подозрительным - это хвосты .map_err(|e| e.into()) , по-моему они лишние
Просто совсем простыня будет в чате. Каких типов не хватает? Есть result, есть его ошибка, есть преобразование, есть функция с возвратом result и все возвращаемые значения. Могу дать типы внутри Block, но это явно будет не в ту степь. Мне тоже не нравится map_err(), но как иначе? type WalResult<T> = Result<T, WalError> не создаёт новый тип, следовательно в этом крейте не будут определены ни тип, ни типаж - то есть я не могу делать .into() сразу, на std::io::Result. Определяю только WalError, для его создания и хвосты map_err()
Идеально было бы минимальный пример на плэйграунде, там хотя бы потыкать можно будет: https://play.rust-lang.org/ > Мне тоже не нравится map_err(), но как иначе? Ну просто то, что ты пытаешься сделать - это распространённая задача в расте (которую как раз обычно делают через thiserror ), и я не припоминаю чтобы у меня в подобных местах были наворочены эти map_err . Просто глаз цепляется, сам.
Попробуй ему указать тогда везде .map_err::<WalResult<_>>(|e| e.into())?;
Обхожусь пока наоборот: явным вызовом WalError::from(e) в замыкании, это проглатывает
Ну ему турбофиш надо указать явный, хз почему у него не выходит.
Обсуждают сегодня