From 46b1ca7af2dcd1532dfc15ee60e47369f7ca165e Mon Sep 17 00:00:00 2001 From: "Hatter Jiang@Pixelbook" Date: Mon, 10 Feb 2020 21:08:27 +0800 Subject: [PATCH] add from, into, try_from, try_into --- into/Cargo.lock | 5 +++++ into/Cargo.toml | 9 ++++++++ into/src/main.rs | 53 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 into/Cargo.lock create mode 100644 into/Cargo.toml create mode 100644 into/src/main.rs diff --git a/into/Cargo.lock b/into/Cargo.lock new file mode 100644 index 0000000..c789192 --- /dev/null +++ b/into/Cargo.lock @@ -0,0 +1,5 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "into" +version = "0.1.0" diff --git a/into/Cargo.toml b/into/Cargo.toml new file mode 100644 index 0000000..565db95 --- /dev/null +++ b/into/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "into" +version = "0.1.0" +authors = ["Hatter Jiang@Pixelbook "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/into/src/main.rs b/into/src/main.rs new file mode 100644 index 0000000..f9f89ed --- /dev/null +++ b/into/src/main.rs @@ -0,0 +1,53 @@ + +use std::convert::{ + TryInto, + TryFrom, +}; + +type BoxError = Box; +type XResult = Result; + +fn do_print(t: T) -> XResult<()> where T: TryInto, T::Error: Into { + println!("--> {}", t.try_into().map_err(Into::into)?); + Ok(()) +} + +fn do_print2(t: T) where T: Into { + println!("==> {}", t.into()) +} + +struct StructX { + name: String, +} + +struct StructY { + name: String, +} + +// auto have: TryInto for StructX +impl TryFrom for String { + type Error = BoxError; + + fn try_from(sx: StructX) -> XResult { + Ok(format!("NAME: {}", sx.name)) + } +} + +impl From for String { + + fn from(sx: StructY) -> Self { + format!("NAME:: {}", sx.name) + } +} + +fn main() -> XResult<()> { + let x = StructX { + name: "hater".to_owned(), + }; + do_print(x)?; + let y = StructY { + name: "hater".to_owned(), + }; + do_print2(y); + Ok(()) +}