Types 在使用迭代器::sum时,必须在此上下文中知道类型

Types 在使用迭代器::sum时,必须在此上下文中知道类型,types,rust,strong-typing,Types,Rust,Strong Typing,我试图实现一个特性,该特性模拟n维空间中两点之间的欧几里德距离。这些点表示为Vec pub特征点{ fn欧几里德函数到(&self,其他:Vec)->f64; } Vec的输入点{ fn欧几里得到(&self,其他:Vec)->f64{ (self.iter() .zip(其他.iter()) .map(|(xa,xb):(&u32,&u32)|(xa-xb).pow(2)) .sum()为f64) .sqrt() } } 逻辑告诉我,没有理由不这样做。据我所知,类型解析器自上而下工作,因此所

我试图实现一个特性,该特性模拟n维空间中两点之间的欧几里德距离。这些点表示为
Vec

pub特征点{
fn欧几里德函数到(&self,其他:Vec)->f64;
}
Vec的输入点{
fn欧几里得到(&self,其他:Vec)->f64{
(self.iter()
.zip(其他.iter())
.map(|(xa,xb):(&u32,&u32)|(xa-xb).pow(2))
.sum()为f64)
.sqrt()
}
}
逻辑告诉我,没有理由不这样做。据我所知,类型解析器自上而下工作,因此所有类型都应该是已知的。我正在使用Intellij Rust,直到
.map(|(xa,xb):(&u32,&u32)
编译器得到了很好的类型,至少我相信它得到了,因为它能够在我显式指定类型之前找出并给出关于
(xa,xb)
的类型提示

就我所见,当我使用
sum()
时,一切都会变得很糟糕。我很确定我遗漏了一些东西,因为类型解析器不太可能不知道一些
u32
的和是另一个
u32
,但它仍然给出了在这个上下文中必须知道的
类型


我到底缺少什么?

我建议检查文档中的新功能。定义如下:

fn sum<S>(self) -> S
where
    S: Sum<Self::Item>, 
还可以将结果隐藏在显式类型化变量中:

fn euclidean_to(&self, other: Vec<u32>) -> f64 {
    let x: u32 = self.iter()
        .zip(other)
        .map(|(xa, xb)| (xa - xb).pow(2))
        .sum();

    (x as f64).sqrt()
}
fn欧几里得到(&self,其他:Vec)->f64{
设x:u32=self.iter()
.zip(其他)
.map(|(xa,xb)|(xa-xb).pow(2))
.sum();
(x为f64.sqrt()
}

这与。

更简单的示例完全相同:
fn main(){let ans=(0u32..10u32).sum();}
无法编译,出现
错误[E0282]:需要键入注释。
。如果您对
sum
的调用进行涡轮钓鱼,它将编译。我明白了,这是有意义的。谢谢!
.sum::<MyType>()
fn euclidean_to(&self, other: Vec<u32>) -> f64 {
    let x: u32 = self.iter()
        .zip(other)
        .map(|(xa, xb)| (xa - xb).pow(2))
        .sum();

    (x as f64).sqrt()
}