From
và Into
Hai trait From
và Into
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); }