Rust基本语法 part1
你看到的 sum::<f32>() 是 Rust 中的涡轮鱼(turbofish)语法,用于指定泛型参数的类型。
让我详细解释一下:
基本概念
Iterator::sum 是一个泛型方法,其签名是:
fn sum<S>(self) -> S
where
S: Sum<Self::Item>
这意味着 sum() 需要知道返回值的具体类型。通常 Rust 可以通过类型推断自动确定,但在某些情况下需要显式指定。
涡轮鱼语法
::<T> 就是涡轮鱼语法,它用于在方法调用中指定泛型参数:
// 1. 通过类型推断(常用方式)
let x: f32 = iter.sum(); // 编译器从变量类型推断出 f32
// 2. 通过涡轮鱼语法
let y = iter.sum::<f32>(); // 显式指定返回 f32
你的代码例子
a.iter()
.zip(b.iter())
.map(|(x, y)| (x - y).powi(2))
.sum::<f32>() // 显式告诉编译器:sum 应该返回 f32 类型
.sqrt()
为什么需要在这里使用?
- 链式调用:在长链式调用中,有时类型推断不够明确
- 明确性:让代码意图更清晰
- 必要情况:当编译器无法推断时,必须使用
其他例子
// 收集为特定类型
let vec: Vec<i32> = (0..5).collect(); // 通过变量类型推断
let vec = (0..5).collect::<Vec<i32>>(); // 通过涡轮鱼
// 解析字符串
let num = "42".parse::<i32>().unwrap();
命名由来
::<> 看起来像一条鱼 🐟,所以叫 “turbofish”(涡轮鱼)!
在你的代码中,使用 sum::<f32>() 是明确告诉编译器:“我对这个迭代器调用 sum 方法,希望得到 f32 类型的结果”。