Arrays 沿维和数组

Arrays 沿维和数组,arrays,sum,rust,Arrays,Sum,Rust,在许多语言(Fortran、Matlab/Octave、Julia等)中,类似于sum(array,n)的表达式将沿第n维对数组的值求和,并输出一个较低维的数组。铁锈里有没有类似的东西 我试过: fn main() { let arr1: [f64; 5] = [1.1, 1.2, 2.3, 3.4, 4.5555]; println!("this {}", arr1.iter().sum()) } 出现此错误时: 错误[E0282]:无法推断有关的足够类型信息`_` -->s

在许多语言(Fortran、Matlab/Octave、Julia等)中,类似于
sum(array,n)
的表达式将沿第n维对数组的值求和,并输出一个较低维的数组。铁锈里有没有类似的东西

我试过:

fn main() {
    let arr1: [f64; 5] = [1.1, 1.2, 2.3, 3.4, 4.5555];
    println!("this {}", arr1.iter().sum())
}
出现此错误时:

错误[E0282]:无法推断有关的足够类型信息`_`
-->src/main.rs:3:37
|
3 | println!(“this{}”,arr1.iter().sum())
|^^^无法推断的类型`_`
:2:27:2:58注:在格式的扩展中_args!
:3:1:3:54注:在此扩展打印中!(定义见)
src/main.rs:3:5:3:43注:在println的扩展中!(定义见)
|
=注意:需要类型批注或泛型参数绑定

在这种情况下,您必须明确指定元素的类型:

println!("this {}", arr1.iter().sum::<f64>())

在这种情况下,必须显式指定元素的类型:

println!("this {}", arr1.iter().sum::<f64>())
“无法推断有关
的足够类型信息”
错误消息在其他几个问题中进行了解释。见和。基本上,这意味着编译器没有足够的信息来指定函数或数据类型中的所有类型参数

尽管如此,这种特殊情况可能会引起一些混淆:为什么不能
Iterator.sum()
直接推断迭代器的
项的结果和类型
?假设把
f64
s加起来,我们会期望得到
f64
,对吗?那么,方法
sum
实际上是这样定义的:

fn sum<S>(self) -> S 
    where S: Sum<Self::Item>
这一特点使我们可以自由地对数字进行求和,并同样引用数字:

static MAGIC_CODE: u32 = 0xDEADBEEF;
static BLAND_CODE: u32 = 0x1234ABCD;

fn main() {

    let sum1: u32 = vec![MAGIC_CODE, BLAND_CODE] // vec! infers to Vec<u32>
        .into_iter().sum();

    let sum2 = vec![&MAGIC_CODE, &BLAND_CODE] // vec! infers to Vec<&u32>
        .into_iter().sum::<u32>();


    assert_eq!(sum1, sum2);
}
static MAGIC\u code:u32=0xDEADBEEF;
静态BLAND_代码:u32=0x1234ABCD;
fn main(){
让sum1:u32=vec![MAGIC_-CODE,BLAND_-CODE]//vec!推断为vec
.into_iter().sum();
让sum2=vec![&MAGIC_-CODE,&BLAND_-CODE]//vec!推断为vec
)和:();
断言(sum1,sum2);
}
另一方面,这也意味着总和的定义变得更加松散:实现
sum
(或
sum
)的任何其他数据类型都可能在上述代码中取代其位置,从而导致上述歧义。为了便于演示,本代码还编译:

use std::iter::Sum;

struct Accumulator(bool);

impl Sum<u32> for Accumulator {
    fn sum<I: Iterator<Item = u32>>(mut iter: I) -> Self {
        Accumulator(iter.any(|v| v != 0))
    }
}

fn main() {
    let sum3: Accumulator = {
        let data = vec![MAGIC_CODE, BLAND_CODE];

        data.into_iter().sum()
    };

    assert!(sum3.0);
}
使用std::iter::Sum;
结构累加器(bool);
累加器的impl和{
fn sum(mut iter:I)->Self{
蓄能器(iter任何(|v | v!=0))
}
}
fn main(){
设sum3:累加器={
让data=vec![MAGIC_码,BLAND_码];
data.into_iter().sum()
};
断言!(sum3.0);
}
.

在其他几个问题中解释了“无法推断有关
\u
的足够类型信息”错误消息。见和。基本上,这意味着编译器没有足够的信息来指定函数或数据类型中的所有类型参数

尽管如此,这种特殊情况可能会引起一些混淆:为什么不能
Iterator.sum()
直接推断迭代器的
项的结果和类型
?假设把
f64
s加起来,我们会期望得到
f64
,对吗?那么,方法
sum
实际上是这样定义的:

fn sum<S>(self) -> S 
    where S: Sum<Self::Item>
这一特点使我们可以自由地对数字进行求和,并同样引用数字:

static MAGIC_CODE: u32 = 0xDEADBEEF;
static BLAND_CODE: u32 = 0x1234ABCD;

fn main() {

    let sum1: u32 = vec![MAGIC_CODE, BLAND_CODE] // vec! infers to Vec<u32>
        .into_iter().sum();

    let sum2 = vec![&MAGIC_CODE, &BLAND_CODE] // vec! infers to Vec<&u32>
        .into_iter().sum::<u32>();


    assert_eq!(sum1, sum2);
}
static MAGIC\u code:u32=0xDEADBEEF;
静态BLAND_代码:u32=0x1234ABCD;
fn main(){
让sum1:u32=vec![MAGIC_-CODE,BLAND_-CODE]//vec!推断为vec
.into_iter().sum();
让sum2=vec![&MAGIC_-CODE,&BLAND_-CODE]//vec!推断为vec
)和:();
断言(sum1,sum2);
}
另一方面,这也意味着总和的定义变得更加松散:实现
sum
(或
sum
)的任何其他数据类型都可能在上述代码中取代其位置,从而导致上述歧义。为了便于演示,本代码还编译:

use std::iter::Sum;

struct Accumulator(bool);

impl Sum<u32> for Accumulator {
    fn sum<I: Iterator<Item = u32>>(mut iter: I) -> Self {
        Accumulator(iter.any(|v| v != 0))
    }
}

fn main() {
    let sum3: Accumulator = {
        let data = vec![MAGIC_CODE, BLAND_CODE];

        data.into_iter().sum()
    };

    assert!(sum3.0);
}
使用std::iter::Sum;
结构累加器(bool);
累加器的impl和{
fn sum(mut iter:I)->Self{
蓄能器(iter任何(|v | v!=0))
}
}
fn main(){
设sum3:累加器={
让data=vec![MAGIC_码,BLAND_码];
data.into_iter().sum()
};
断言!(sum3.0);
}

.

我正在使用Ubuntu apt存储库中的
rustc 1.7.0
,并获得:
test.rs:19:29:19:34错误:使用了不稳定的库功能“iter\u arith”:最近更改了边界(见第27739期)
@JonatanÖström您应该更新!现在,1.12.1是最新的,它代表了应用于编译器的大约30周的额外工作;包括更好的错误消息。我一小时前刚在这台机器上安装了它,所以我想我应该使用其他渠道。是获取Rust编译器和其他有用资源的最佳方法之一。一定要试试看。:)@谢谢,我去看看!我正在使用Ubuntu apt存储库中的
rustc 1.7.0
,并得到:
test.rs:19:29:19:34错误:使用了不稳定的库功能“iter\u arith”:最近更改了边界(见问题27739)
@JonatanÖström您应该更新!现在,1.12.1是最新的,它代表了应用于编译器的大约30周的额外工作;包括更好的错误消息。我一小时前刚在这台机器上安装了它,所以我想我应该使用其他渠道。是获取Rust编译器和其他有用资源的最佳方法之一。一定要试试看。:)@谢谢,我去看看!