面试题答案
一键面试From 和 Into trait 的作用
- From trait:
From
trait 定义了一个从一种类型转换为另一种类型的方式。它只有一个方法from
,通常用于定义一种 “自然” 的转换方式,即从T
到U
的转换。如果类型U
实现了From<T>
,那么就可以使用U::from(t)
的方式将T
类型的值t
转换为U
类型。 - Into trait:
Into
trait 依赖于From
trait。如果类型U
实现了From<T>
,那么T
自动实现了Into<U>
。它主要提供了一种反向的转换便利性,即可以使用t.into()
将T
类型的值t
转换为U
类型,这里编译器会去查找U::from(t)
的实现。
代码示例
// 定义源结构体
struct SourceStruct {
value: i32,
}
// 定义目标结构体
struct TargetStruct {
new_value: i32,
}
// 为 TargetStruct 实现 From<SourceStruct>
impl From<SourceStruct> for TargetStruct {
fn from(source: SourceStruct) -> Self {
TargetStruct {
new_value: source.value * 2,
}
}
}
fn main() {
let source = SourceStruct { value: 5 };
// 使用 From trait 的方式进行转换
let target1 = TargetStruct::from(source);
println!("Using From: new_value = {}", target1.new_value);
let source2 = SourceStruct { value: 10 };
// 使用 Into trait 的方式进行转换
let target2: TargetStruct = source2.into();
println!("Using Into: new_value = {}", target2.new_value);
}
在上述代码中:
- 首先定义了
SourceStruct
和TargetStruct
两个自定义结构体。 - 为
TargetStruct
实现了From<SourceStruct>
,在from
方法中,将SourceStruct
中的value
乘以 2 赋值给TargetStruct
的new_value
。 - 在
main
函数中,展示了分别使用From
trait 的TargetStruct::from(source)
和Into
trait 的source.into()
两种方式将SourceStruct
转换为TargetStruct
。