该代码适用于:

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的方式,返回值是开放的;不止一种类型可以实现trait 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

由于两种结果类型都是可能的,因此不能推断该类型,必须通过turbofish(sum::<X>())或表达式(let x: X = ...sum();)显式指定.

Rust相关问答推荐

是否有一种可靠的方法可以将Arc弦乐转换/转换为Arc Vec u8>>

为什么是!为Rust中的RwLockReadGuard和RwLockWriteGuard实现的发送特征?

Rust中的相互递归特性与默认实现

使用pyo3::Types::PyIterator的无限内存使用量

当rust中不存在文件或目录时,std::FS::File::Create().unwire()会抛出错误

如何go 除铁 rust 中路径组件的第一项和最后一项?

有没有办法避免在While循环中多次borrow `*分支`

如何指定不同的类型来常量Rust中的泛型参数?

关于使用平面图功能的borrow 判断器的问题

如何迭代属性以判断相等性?

是否提供Bundle 在可执行文件中的warp中的静态文件?

为什么`tokio::main`可以直接使用而不需要任何导入?

为什么 js_sys Promise::new 需要 FnMut?

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

Rust 中的 Option as_ref 和 as_deref 有什么不同

如何获取函数中borrow 的切片的第一部分?

我的 Axum 处理程序无法编译:未实现 IntoResponse 特征

如何在 Rust Polars 中可靠地连接 LazyFrames

Rust 中的let是做什么的?

如何在没有 `make_contiguous()` 的情况下对 VecDeque 进行排序或反转?