error handling - How to convert FromStrRadixErr to ParseIntError? -


i'm trying build generic wrapper around std::<t>::from_str_radix. according documentation, from_str_radix returns result<t, parseinterror>.

fn foo<t: num_traits::num>() -> result<t, std::num::parseinterror> {     t::from_str_radix("4242", 10) } 

won't compile:

error: mismatched types: expected core::result::result<t, core::num::parseinterror>, found core::result::result<t, <t num_traits::num>::fromstrradixerr>

on other hand, this

fn main() {     let x: result<u8, std::num::parseinterror> = foo();     println!("{:?}", x); }  fn foo<t: num_traits::num>() -> result<t, <t num_traits::num>::fromstrradixerr> {     t::from_str_radix("4242", 10) } 

compiles fine , prints expected result

err(parseinterror { kind: overflow })

to mind, both same situation, i'm wrong. can explain me difference , possibly show me solution?

how convert fromstrradixerr parseinterror?

it's not possible. errors, io::error, allow create instance causing error, can create error wraps error. if parseinterror had such functionality, create parseinterror caused fromstrradixerr error, parseinterror not.

can explain me difference?

this code:

fn foo<t: num_traits::num>() -> result<t, std::num::parseinterror> {     t::from_str_radix("4242", 10) } 

does not compile because returned type of t::from_str_radix result<t, fromstrradixerr> not result<t, parseinterror>. changing return type (as did) result<t, fromstrradixerr>, solves problem.

this code:

fn main() {     let x: result<u8, std::num::parseinterror> = foo();     println!("{:?}", x); }  fn foo<t: num_traits::num>() -> result<t, <t num_traits::num>::fromstrradixerr> {     t::from_str_radix("4242", 10) } 

compiles fine because num trait implementation u8 defines fromstrradixerr = parseinterror.

if change u8 f32:

let x: result<f32, std::num::parseinterror> = foo(); 

it fails compile. reason num implementation f32 defines fromstrradixerr = parsefloaterror , parsefloaterror not parseinterror.

and possibly show me solution?

you said trying build generic wrapper around std::<t>::from_str_radix, examples use t::from_str_radix t: num, trying write wrapper around num::from_str_radix.

one option use num , fromstrradixerr directly instead of creating wrapper, in end, num wrapper.

maybe want restrict wrapper primitive integers , use parseinterror. in case, can add restriction fromstrradixerr = parseinterror:

fn foo<t>() -> result<t, std::num::parseinterror>     t: num_traits::num<fromstrradixerr = std::num::parseinterror>, {     t::from_str_radix("4242", 10) } 

Comments

Popular posts from this blog

PySide and Qt Properties: Connecting signals from Python to QML -

c# - DevExpress.Wpf.Grid.InfiniteGridSizeException was unhandled -

scala - 'wrong top statement declaration' when using slick in IntelliJ -