面试题答案
一键面试-
定义标记trait: 在Rust中,定义一个简单的标记trait如下:
// 定义标记trait pub trait MarkerTrait {}
这里定义的
MarkerTrait
没有任何方法,它仅仅作为一个标记存在。 -
为结构体实现标记trait: 假设
StructA
、StructB
、StructC
如下:struct StructA; struct StructB; struct StructC; // 为StructA实现MarkerTrait impl MarkerTrait for StructA {} // 为StructB实现MarkerTrait impl MarkerTrait for StructB {} // 为StructC实现MarkerTrait impl MarkerTrait for StructC {}
-
定义泛型函数:
// 定义泛型函数,只接受实现了MarkerTrait的结构体作为参数 pub fn generic_function<T: MarkerTrait>(param: T) { // 这里可以对param进行操作,虽然现在只是一个示例,没有具体操作 println!("Received a struct that implements MarkerTrait"); }
-
标记trait的约束作用解释:
- 编译时检查:标记trait在泛型函数
generic_function
的定义中,通过T: MarkerTrait
这种语法,对泛型类型参数T
进行了约束。在编译时,如果调用generic_function
传入的类型没有实现MarkerTrait
,编译器会报错。例如,如果定义一个新的结构体StructD
没有实现MarkerTrait
,试图将其作为参数传递给generic_function
,编译器会指出类型不匹配的错误。 - 类型筛选:标记trait就像是一个“通行证”,只有实现了这个trait的结构体才能作为参数传递给泛型函数。这有助于确保泛型函数在处理不同类型参数时,这些参数都具有某种共性,在这个场景下,共性就是实现了
MarkerTrait
。它使得代码在处理不同结构体时,有了一种统一的前提条件,提高了代码的安全性和可维护性。例如,如果generic_function
内部的逻辑依赖于传入的结构体具有某种统一的行为(虽然这里标记trait没有定义具体行为,但可以想象后续扩展trait增加方法),那么通过标记trait的约束,就能保证传入的结构体都满足这种预期。
- 编译时检查:标记trait在泛型函数