what's the difference between From and FromResidual traits
The purpose differs:
- FromResidual is/serves the Try trait
- while
From
serves as a general value-to-value conversion with the input value consumed
and what's the difference in use?
You implement From<WhateverTypes> for YourType
or From<YourType> for ForeignType
to allow converting generally. It's a common trait to implement. In addition, there's a blanket implementation of Into
based on From
. So whenever you've used .into()
, it's probably due to a From
implementation as well.
You only implement FromResidual
if you're making a custom Try
(?
) implementation, and there's no reason to use it directly. It's part of ?
desugaring. It's also not yet stable.
When you use ?
on a Result
, the Err
variant may be transformed. You might have seen this approximated as
// let x = res?;
let x = match res {
Ok(r) => r,
Err(e) => return From::from(e),
};
But the modern desugaring doesn't use From
directly, it uses FromResidual
. This let's the choice of supported ?
conversion be implementation specific.
thank you very mutch
Importantly, there's no blanket for FromResidual
, and there are implementations of it which would coherence-conflict with said blanket.
And even if it were possible to write those impls in future (with some kind of specialization), it's possible that what ?
wants will be different from what .into()
wants. (We'll see. Could reasonably go either way on that one.)
This topic was automatically closed 90 days after the last reply. We invite you to open a new topic if you have further questions or comments.