From
e Into
As características From
e Into
estão inerentemente ligadas, e isto é efetivamente parte da sua implementação. Se fores capaz de converter o tipo A a partir do tipo B, então deveria ser fácil acreditar que deveríamos ser capaz de converter o tipo B para o tipo A.
From
A característica From
permite um tipo definir como criar-se a partir doutro tipo, daí fornecendo um mecanismo muito simples para converter entre vários tipos. Existem numerosas implementações desta característica dentro da biblioteca padrão para conversão de tipos primitivos e comuns.
Por exemplo podemos facilmente converter uma str
numa String
:
#![allow(unused)] fn main() { let my_str = "hello"; let my_string = String::from(my_str); }
Nós podemos fazer algo semelhante para definir uma conversão para o nosso próprio tipo.
use std::convert::From; #[derive(Debug)] struct Number { value: i32, } impl From<i32> for Number { fn from(item: i32) -> Self { Number { value: item } } } fn main() { let num = Number::from(30); println!("My number is {:?}", num); }
Into
A característica Into
é simplesmente o recíproco da característica From
. Isto é, se tiveres implementado a característica From
para o teu tipo, Into
o chamará quando necessário.
O uso da característica Into
normalmente exigirá especificação do tipo para converter conforme o compilador for incapaz de determinar isto na maioria das vezes. No entanto, isto é um pequeno compromisso considerando que recebemos a funcionalidade gratuitamente:
use std::convert::From; #[derive(Debug)] struct Number { value: i32, } impl From<i32> for Number { fn from(item: i32) -> Self { Number { value: item } } } fn main() { let int = 5; // Tente remover a anotação de tipo let num: Number = int.into(); println!("My number is {:?}", num); }