为何Rust中`Vec<i64>`求和需标注类型而非自动推导为`Option<i64>`?
Rust中sum()方法必须显式指定类型的原因
先看你给出的代码:
fn my_func(v: Vec<i64>) { let sum = v.into_iter().sum(); } fn main() { }
这段代码会报错,必须写成v.into_iter().sum::<i64>()或者指定其他具体类型,原因在于Rust类型推导的规则和sum()方法的设计:
sum()是迭代器的泛型方法,它的返回类型S只要实现了Sum<i64>trait即可。而满足这个条件的类型不止一种:i64、i128、Option<i64>、Result<i64, E>(只要错误类型E符合要求)甚至自定义数值类型都可以实现这个trait。- 在你的代码里,变量
sum没有任何上下文约束:既没有被指定类型,也没有参与后续运算、作为参数传递或者返回值。编译器完全无法确定你想要的是哪种S类型——是直接返回总和的i64?还是处理空迭代器的Option<i64>?或者更大范围的i128? - 因此Rust要求你必须显式标注类型,明确告诉编译器你需要的具体返回类型。
内容的提问来源于stack exchange,提问作者ignoring_gravity
相关产品推荐
相关产品推荐

