Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 33 additions & 6 deletions src/conversion/from_into.md
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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::From;

#[derive(Debug)]
struct Number {
value: i32,
}

// Define `From`
impl From<i32> 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