Los tipos que implementan From y Into facilitan las conversiones de tipos:
fn main() {
let s = String::from("hello");
let addr = std::net::Ipv4Addr::from([127, 0, 0, 1]);
let one = i16::from(true);
let bigger = i32::from(123i16);
println!("{s}, {addr}, {one}, {bigger}");
}
Into se implementa automáticamente cuando se implementa From:
fn main() {
let s: String = "hello".into();
let addr: std::net::Ipv4Addr = [127, 0, 0, 1].into();
let one: i16 = true.into();
let bigger: i32 = 123i16.into();
println!("{s}, {addr}, {one}, {bigger}");
}
Es por eso que es común implementar solo From, ya que su tipo también entrará en la implementación de Into.
Al declarar un tipo de entrada de argumento de función como "cualquier cosa que pueda convertirse en una cadena", la regla es la opuesta, debes usar Into. Su función aceptará tipos que implementen From y aquellos que solo implementen Into.