| # `TryFrom` and `TryInto` |
| |
| Similar to [`From` and `Into`][from-into], [`TryFrom`] and [`TryInto`] are |
| generic traits for converting between types. Unlike `From`/`Into`, the |
| `TryFrom`/`TryInto` traits are used for fallible conversions, and as such, |
| return [`Result`]s. |
| |
| [from-into]: from_into.html |
| [`TryFrom`]: https://doc.rust-lang.org/std/convert/trait.TryFrom.html |
| [`TryInto`]: https://doc.rust-lang.org/std/convert/trait.TryInto.html |
| [`Result`]: https://doc.rust-lang.org/std/result/enum.Result.html |
| |
| ```rust,editable |
| use std::convert::TryFrom; |
| use std::convert::TryInto; |
| |
| #[derive(Debug, PartialEq)] |
| struct EvenNumber(i32); |
| |
| impl TryFrom<i32> for EvenNumber { |
| type Error = (); |
| |
| fn try_from(value: i32) -> Result<Self, Self::Error> { |
| if value % 2 == 0 { |
| Ok(EvenNumber(value)) |
| } else { |
| Err(()) |
| } |
| } |
| } |
| |
| fn main() { |
| // TryFrom |
| |
| assert_eq!(EvenNumber::try_from(8), Ok(EvenNumber(8))); |
| assert_eq!(EvenNumber::try_from(5), Err(())); |
| |
| // TryInto |
| |
| let result: Result<EvenNumber, ()> = 8i32.try_into(); |
| assert_eq!(result, Ok(EvenNumber(8))); |
| let result: Result<EvenNumber, ()> = 5i32.try_into(); |
| assert_eq!(result, Err(())); |
| } |
| ``` |