如果我参选

fn my_func(v: Vec<i64>) {
    let sum = v.into_iter().sum();
}

fn main() {
}

然后Rust希望我提供一个类型注解并编写

v.into_iter().sum::<i64>()

我只是想弄明白--为什么?

推荐答案

如果你看看sum method on Iterator的定义 你可以看到它是泛型的,输出类型为S: Sum<Self::Item>.

这意味着您可以自由地为您自己的类型实现Sum特征,并将Vec<i64>加到您的自定义类型中.因此,编译器无法推断类型应该是什么.

顺便说一下,输出是S而不是Option<S>.空向量的sum::<i64>0.

拉斯特本可以决定用"你的"方式来定义"和":

fn sum(self) -> Option<Self::Item>
where
  Self::Item : Add<Output=Self::Item>

但他们并没有让它变得更笼统.

Rust相关问答推荐

为什么拥有的trait对象的相等运算符移动了正确的操作数?

访问Rust中的隐藏变量

如何从铁 rust 中呼唤_mm_256_mul_ph?

有没有办法模仿对象安全克隆?

在Rust中显式装箱受生存期限制的转换闭包

支持TLS的模拟HTTP服务器

闭包不会发送,即使它只捕获发送变量

函数内模块的父作用域的访问类型

在使用AWS SDK for Rust时,如何使用硬编码访问密钥ID和密钥凭据?

如何将单个 struct 实例与插入器一起传递到Rust中的映射

如何在不调用Collect()的情况下为新型vec实现IntoIterator?

确保参数是编译时定义的字符串文字

是否可以在不直接重复的情况下为许多特定类型实现一个函数?

Button.set_hexpand(false) 不会阻止按钮展开

如何基于常量在Rust中跳过一个测试

如何将 Rust 字符串转换为 i8(c_char) 数组?

判断对象是 PyDatetime 还是 Pydate 的实例?

`use std::error::Error` 声明中断编译

为实现特征的所有类型实现显示

如何用另一个变量向量置换 rust simd 向量?