I was recently surprised that the Into
trait implementation for Result and Option is not to simply wrap the subject with Ok
or Some
respectively. It might be instructive if some could explain why this was done. There may be a need to effect elegant suppression of blanket implementations.
Your premise is false. impl<T> From<T> for Option<T>
simply wraps in Some
, and there is no equivalent impl for Result
. There's also no explicit Into
impl for either type, they are covered by the blanket impl.
3 Likes
Indeed. Thanks.
fn check() {
let _ :Option<i32> = Some(23);
let _ :Result<i32,()> = Ok(23);
//the trait bound `Result<i32, ()>: From<{integer}>` is not satisfied
// ...naively expected Ok(23)
//let _: Result<i32,()> = 23.into();
let x: Option<i32> = 23.into();
//the trait bound `Result<i32, ()>: From<Option<i32>>` is not satisfied
// ...naively expected Ok(x) for whatever x is.
//let _: Result<i32,()> = x.into();
let _: Result<i32,()> = x.ok_or(());
}
My journey into rust continues.