Types 在使用迭代器::sum时,必须在此上下文中知道类型
我试图实现一个特性,该特性模拟n维空间中两点之间的欧几里德距离。这些点表示为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() } } 逻辑告诉我,没有理由不这样做。据我所知,类型解析器自上而下工作,因此所
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()
}