rust - Casting to a generic type -
i have newbie question generics in rust (version 1.0).
let's write generic function division. never mind usefulness of such function; it's simple function keep question simple.
fn divide<t: std::ops::div>(a: t, b: t) -> t { / b } fn main() { println!("{}", divide(42, 18)) } this program fails compile.
src/main.rs:2:5: 2:10 error: mismatched types: expected `t`, found `<t core::ops::div>::output` (expected type parameter, found associated type) [e0308] src/main.rs:2 / b ^~~~~ i understand compiler error telling me result of division operation type output, not t, , see output type in standard library documentation.
how convert output t? try use as cast.
fn divide<t: std::ops::div>(a: t, b: t) -> t { (a / b) t } fn main() { println!("{}", divide(42, 18)) } this causes different compiler error.
src/main.rs:2:5: 2:17 error: non-scalar cast: `<t core::ops::div>::output` `t` src/main.rs:2 (a / b) t ^~~~~~~~~~~~ i'm out of ideas make work, , realize lack understanding of fundamental language here, don't know make work. help?
you have specify t::output return type of function:
fn divide<t: std::ops::div>(a: t, b: t) -> t::output { / b } edit add more explanation on why cannot cast inside function
when in generic function divide, compiler yet doesn't know can cast t t::output, cast invalid. generic types, can anything, how compiler knows can cast t t::output ?
a / b produces of type t::output, in solution above there not cast, t::output right type.
edit add possible solution using std::convert::from
the (i think) generic implementation when know cast t::output t possible. can bound t implement from t::output. complete example:
use std::ops::div; use std::convert::from; fn divide<t: div>(a: t, b: t) -> t t: from<<t div>::output> { t::from(a / b) } #[derive(debug)] struct bip(u32); impl div bip { type output = f32; fn div(self, rhs: bip) -> f32 { (self.0 / rhs.0) f32 } } impl from<f32> bip { fn from(value: f32) -> self { bip(value u32) } } fn main() { println!("{:?}", divide(12, 4)); println!("{:?}", divide(bip(12), bip(4))); }
Comments
Post a Comment