Expand description
Simple and safe type conversions that may fail in a controlled
way under some circumstances. It is the reciprocal of TryInto.
This is useful when you are doing a type conversion that may
trivially succeed but may also need special handling.
For example, there is no way to convert an i64 into an i32
using the From trait, because an i64 may contain a value
that an i32 cannot represent and so the conversion would lose data.
This might be handled by truncating the i64 to an i32 (essentially
giving the i64’s value modulo i32::MAX) or by simply returning
i32::MAX, or by some other method. The From trait is intended
for perfect conversions, so the TryFrom trait informs the
programmer when a type conversion could go bad and lets them
decide how to handle it.
Generic Implementations
TryFrom<T> for UimpliesTryInto<U> for Ttry_fromis reflexive, which means thatTryFrom<T> for Tis implemented and cannot fail – the associatedErrortype for callingT::try_from()on a value of typeTisInfallible. When the!type is stabilizedInfallibleand!will be equivalent.
TryFrom<T> can be implemented as follows:
struct GreaterThanZero(i32);
impl TryFrom<i32> for GreaterThanZero {
type Error = &'static str;
fn try_from(value: i32) -> Result<Self, Self::Error> {
if value <= 0 {
Err("GreaterThanZero only accepts value superior than zero!")
} else {
Ok(GreaterThanZero(value))
}
}
}RunExamples
As described, i32 implements TryFrom<i64>:
let big_number = 1_000_000_000_000i64;
// Silently truncates `big_number`, requires detecting
// and handling the truncation after the fact.
let smaller_number = big_number as i32;
assert_eq!(smaller_number, -727379968);
// Returns an error because `big_number` is too big to
// fit in an `i32`.
let try_smaller_number = i32::try_from(big_number);
assert!(try_smaller_number.is_err());
// Returns `Ok(3)`.
let try_successful_smaller_number = i32::try_from(3);
assert!(try_successful_smaller_number.is_ok());RunRequired Associated Types
Required Methods
Implementors
1.59.0 · sourceimpl TryFrom<char> for u8
impl TryFrom<char> for u8
Map char with code point in U+0000..=U+00FF to byte in 0x00..=0xFF with same value, failing
if the code point is greater than U+00FF.
See impl From<u8> for char for details on the encoding.