为何Rust要在方法名后额外声明泛型参数?以mixup<V,W>为例
Rust方法级泛型参数
mixup<V, W>作用说明 impl<T, U>是impl块级别的泛型声明,声明的T、U两个泛型参数对应Point<T, U>结构体本身的两个泛型位,作用域覆盖整个impl块内的所有内容。
而mixup<V, W>是方法级别的泛型声明,它的核心作用是声明V、W是仅属于mixup方法的泛型参数,和impl块的T、U完全独立。如果没有这个声明,方法参数里的Point<V, W>和返回值里的Point<T, W>中出现的V、W都属于未定义的类型标识符,编译器会直接抛出编译错误。
它的实际设计价值有两点:
- 让
mixup方法可以接收任意泛型类型的Point实例作为入参,不需要和当前调用方法的Point实例的泛型保持一致,大幅提升方法的灵活性 - 泛型参数的具体类型会在方法调用时由编译器自动推导,不需要开发者手动标注,就能实现不同泛型
Point实例的字段组合逻辑
下面是可运行的示例代码:
// 定义泛型Point结构体 struct Point<T, U> { x: T, y: U, } impl<T, U> Point<T, U> { // 此处必须声明V、W为方法级泛型参数,否则V、W属于未定义类型 fn mixup<V, W>(self, other: Point<V, W>) -> Point<T, W> { Point { x: self.x, y: other.y, } } } fn main() { let p1 = Point { x: 5, y: "hello" }; // 类型为Point<i32, &str>,对应T=i32、U=&str let p2 = Point { x: false, y: 3.14 }; // 类型为Point<bool, f64>,对应V=bool、W=f64 let p3 = p1.mixup(p2); // 自动推导返回类型为Point<i32, f64>,x取自p1,y取自p2 println!("p3.x = {}, p3.y = {}", p3.x, p3.y); }
运行上述代码会输出:
p3.x = 5, p3.y = 3.14
内容的提问来源于stack exchange,提问作者Zack VT
相关产品推荐
相关产品推荐

