From 0a2ab00a2f19a1e711356be54faaf6a7218f8812 Mon Sep 17 00:00:00 2001 From: Emerick Bosch Date: Sun, 19 May 2024 16:31:33 +0200 Subject: [PATCH 1/2] Clarify interchangability for From and Into Split out a section showing how we get "free" implementation of the `Into` trait if the `From` trait is already defined. --- src/conversion/from_into.md | 39 +++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/src/conversion/from_into.md b/src/conversion/from_into.md index d927cdd78e..2fde7079da 100644 --- a/src/conversion/from_into.md +++ b/src/conversion/from_into.md @@ -42,13 +42,10 @@ fn main() { ## `Into` -The [`Into`] trait is simply the reciprocal of the `From` trait. That is, if you -have implemented the `From` trait for your type, `Into` will call it when -necessary. +The [`Into`] trait is simply the reciprocal of the `From` trait. It +defines how to convert a type into another type. -Using the `Into` trait will typically require specification of the type to -convert into as the compiler is unable to determine this most of the time. -However this is a small trade-off considering we get the functionality for free. +Calling `into()` typically requires us to specify the result type as the compiler is unable to determine this most of the time. ```rust,editable use std::convert::Into; @@ -72,5 +69,35 @@ fn main() { } ``` +## `From` and `Into` are interchangable + +`From` and `Into` are designed to be complementary. +We do not need to provide an implementation for both traits. +If you have implemented the `From` trait for your type, `Into` will call it +when necessary. + +```rust,editable +use std::convert::Into; + +#[derive(Debug)] +struct Number { + value: i32, +} + +// Define `From` +impl From for Number { + fn from(item: i32) -> Self { + Number { value: item } + } +} + +fn main() { + let int = 5; + // use `Into` + let num: Number = int.into(); + println!("My number is {:?}", num); +} +``` + [`From`]: https://doc.rust-lang.org/std/convert/trait.From.html [`Into`]: https://doc.rust-lang.org/std/convert/trait.Into.html From 2caac6e73a546a58fe82274cf30a063193f8f405 Mon Sep 17 00:00:00 2001 From: Emerick Bosch Date: Sun, 19 May 2024 16:36:35 +0200 Subject: [PATCH 2/2] Fix import --- src/conversion/from_into.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/conversion/from_into.md b/src/conversion/from_into.md index 2fde7079da..83beb5d27a 100644 --- a/src/conversion/from_into.md +++ b/src/conversion/from_into.md @@ -77,7 +77,7 @@ If you have implemented the `From` trait for your type, `Into` will call it when necessary. ```rust,editable -use std::convert::Into; +use std::convert::From; #[derive(Debug)] struct Number {