types - 为什么 Rust 不能推断 Iterator::sum 的结果类型?

标签 types rust type-inference

此代码有效:

fn main() {
    let a: i32 = (1i32..10).sum();
    let b = a.pow(2);
}

如果我从 a 中删除 i32 类型,则会出现此错误:

rustc 1.13.0 (2c6933acc 2016-11-07)
error: the type of this value must be known in this context
 --> <anon>:3:13
  |
5 |     let b = a.pow(2);
  |             ^^^^^^^^

Run the example

我原以为 Rust 会将 (1i32..10) 变成一个 i32 迭代器,然后 sum() 知道返回一个i32。我错过了什么?

最佳答案

方式sum已定义,返回值是开放式的;不止一种类型可以实现特征 Sum<i32> .这是一个示例,其中 a 的不同类型被使用,两者都编译:

#[derive(Clone, Copy)]
struct Summer {
    s: isize,
}

impl Summer {
    fn pow(&self, p: isize) {
        println!("pow({})", p);
    }
}

impl std::iter::Sum<i32> for Summer {
    fn sum<I>(iter: I) -> Self
    where
        I: Iterator<Item = i32>,
    {
        let mut result = 0isize;
        for v in iter {
            result += v as isize;
        }
        Summer { s: result }
    }
}

fn main() {
    let a1: i32 = (1i32..10).sum();
    let a2: Summer = (1i32..10).sum();
    let b1 = a1.pow(2);
    let b2 = a2.pow(2);
}

Playground

由于两种结果类型都是可能的,因此无法推断类型,必须明确指定类型,可以通过涡轮鱼 (sum::<X>()) 或作为表达式的结果 (let x: X = ...sum();)。

关于types - 为什么 Rust 不能推断 Iterator::sum 的结果类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51330015/

相关文章:

php - MySQL -- 将 T1 中的 VARCHAR 值插入到 T2 中的 DECIMAL 字段中

c++ - 在 C++ 中实现 is_same_type 类型特征的程序

recursion - 这种递归联接如何在Rust中工作

string - str::as_bytes 和 CString::as_bytes_with_nul 之间有区别吗?

typescript - 为什么 typescript 枚举无助于推断联合类型

java - Java 中的函数 "composition"和类型安全

c++ - 为什么这个输出是0%?

json - Serde反序列化json文件时缺少字段错误

java - 在Scala中,为什么我可以在这里使用 `Unit`作为返回类型?

c# - C# 中的类型推断有哪些优点和缺点?