如何在Rust中总结一系列数字?

Jon*_*ski 7 rust

我想写一个函数来汇总从零到n的数字.(理想情况下,这将是所有数字的通用,但我会满足i32).

mod squares {

    pub fn sum_from_zero( n: i32) -> i32 {
        [0 .. n].fold(0, |a, b| a + b)
    }
}

#[test]
fn test_sum_from_zero() {
    assert_eq!(15, squares::sum_from_zero(5));
}
Run Code Online (Sandbox Code Playgroud)

我得到以下编译器错误:

src/lib.rs:5:18: 5:22 error: no method named `fold` found for type `[std::ops::Range<i32>; 1]` in the current scope
src/lib.rs:5         [0 .. n].fold(0, |a, b| a + b)
                              ^~~~
src/lib.rs:5:18: 5:22 note: the method `fold` exists but the following trait bounds were not satisfied: `[std::ops::Range<i32>; 1] : std::iter::Iterator`, `[std::ops::Range<i32>] : std::iter::Iterator`
Run Code Online (Sandbox Code Playgroud)

我也试过这个sum():

mod squares {

    pub fn sum_from_zero( n: i32) -> i32 {
        [0 .. n].sum()
    }
}

#[test]
fn test_sum_from_zero() {
    assert_eq!(15, squares::sum_from_zero(5));
}
Run Code Online (Sandbox Code Playgroud)

并得到以下编译器错误:

src/lib.rs:5:18: 5:21 error: no method named `sum` found for type `[std::ops::Range<i32>; 1]` in the current scope
src/lib.rs:5         [0 .. n].sum()
                              ^~~
src/lib.rs:5:18: 5:21 note: the method `sum` exists but the following trait bounds were not satisfied: `[std::ops::Range<i32>; 1] : std::iter::Iterator`, `[std::ops::Range<i32>] : std::iter::Iterator`
src/lib.rs:5:18: 5:21 error: no method named `sum` found for type `[std::ops::Range<i32>; 1]` in the current scope
src/lib.rs:5         [0 .. n].sum()
                              ^~~
src/lib.rs:5:18: 5:21 note: the method `sum` exists but the following trait bounds were not satisfied: `[std::ops::Range<i32>; 1] : std::iter::Iterator`, `[std::ops::Range<i32>] : std::iter::Iterator`
Run Code Online (Sandbox Code Playgroud)

我是否必须声明显式边界/特征?

Arj*_*jan 15

问题是你正在创建一个范围数组(方括号)但你只想要范围(定义了折叠).

另一件事是范围语法(..)仅包括下限.它不包含上限,因此您必须迭代n+1才能获得所需的结果.

mod squares {

    pub fn sum_from_zero( n: i32) -> i32 {
        (0 .. n+1).fold(0, |a, b| a + b)
    }
}

#[test]
fn test_sum_from_zero() {
    assert_eq!(15, squares::sum_from_zero(5));
}
Run Code Online (Sandbox Code Playgroud)

  • @JonWolski当前的稳定点是1.12.1 (4认同)
  • 从Rust 1.11开始,`Iterator`特性有一个`sum`方法,范围是迭代器,因此不需要'fold`.另外,没有提到n×(n + 1)/ 2? (2认同)
  • @mcarton:假设他对学习如何迭代感兴趣,而不是封闭形式:) (2认同)