FromInto

Hai trait FromInto vốn dĩ có liên kết với nhau, và đây thực sự là một phần trong quá trình triển khai chúng. Nếu bạn có thể chuyển đổi kiểu A từ kiểu B, thì ngược lại cũng có thể dễ dàng chuyển kiểu B sang kiểu A.

From

Trait From cho phép một kiểu xác định cách tạo ra chính nó từ một kiểu khác, do đó cung cấp một cơ chế rất đơn giản để chuyển đổi giữa một số kiểu. Có nhiều cách triển khai trait này trong thư viện tiêu chuẩn để chuyển đổi các kiểu dữ liệu nguyên thủy và thông dụng.

Ví dụ, chúng ta có thể dễ dàng chuyển đổi một str thành một String

#![allow(unused)]
fn main() {
let my_str = "hello";
let my_string = String::from(my_str);
}

Chúng ta cũng có thể làm điều tương tự để định nghĩa cách chuyển đổi kiểu cho kiểu tùy chỉnh của chúng ta.

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

Trait Into đơn giản là phần tương hỗ của From. Có nghĩa là, nếu bạn đã triển khai From trait cho kiểu của bạn, Into sẽ gọi nó khi cần thiết.

Sử dụng trait Into thường sẽ yêu cầu mô tả kỹ thuật của kiểu dữ liệu mục tiêu mà bạn muốn chuyển đổi tới vì trình biên dịch không thể xác định điều này. Tuy nhiên, đây chỉ là một sự đánh đổi nhỏ khi mà chúng ta nhận lại được một chức năng miễn phí.

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;
    // Try removing the type declaration
    let num: Number = int.into();
    println!("My number is {:?}", num);
}