Generics 解决特征实现冲突
我正在尝试用Rust编写一些通用数学函数,并不断遇到以下错误消息:Generics 解决特征实现冲突,generics,traits,rust,Generics,Traits,Rust,我正在尝试用Rust编写一些通用数学函数,并不断遇到以下错误消息: 错误:trait SoAndSo的实现冲突 有可能解决这个问题吗?如果是,怎么做 例如,我正在尝试编写一个通用的点积,它使用两个迭代器,对它们进行压缩,并对这些迭代器对进行迭代,以累积积。我希望这个函数也能计算复数点积。复数上的点积包括共轭一面。我的第一个想法是为一个二进制函数编写一个traitDot1,以替换Mul,因为它还与左侧参数共轭。以下是完整的代码: extern crate num; use num::compl
错误:trait SoAndSo的实现冲突
有可能解决这个问题吗?如果是,怎么做
例如,我正在尝试编写一个通用的点积,它使用两个迭代器,对它们进行压缩,并对这些迭代器对进行迭代,以累积积。我希望这个函数也能计算复数点积。复数上的点积包括共轭一面。我的第一个想法是为一个二进制函数编写一个traitDot1
,以替换Mul
,因为它还与左侧参数共轭。以下是完整的代码:
extern crate num;
use num::complex::Complex;
use num::{Float, Num};
trait Dot1<Rhs, Result> {
fn dot1(&self, rhs: Rhs) -> Result;
}
impl<T: Float> Dot1<T, T> for T {
// conjugation for reals is a no-op
fn dot1(&self, rhs: T) -> T {
*self * rhs
}
}
impl<T: Num + Clone> Dot1<Complex<T>, Complex<T>> for Complex<T> {
fn dot1(&self, rhs: Complex<T>) -> Complex<T> {
self.conj() * rhs
}
}
fn main() {
println!("Hello, world!")
}
如何编写一个通用的、基于迭代器的点积,它既适用于实数,也适用于复数?使用迭代器、压缩迭代器等都不是问题,我甚至能够找出使用哪些边界的类型参数。我似乎无法使用上面提到的特性来“统一”某些数据类型。这里的问题是(当前)编译器没有注册Complex
没有实现Float
。想象一下,如果Complex
实现了Float
:要么必须有某种方法来决定使用哪个impl
,要么重叠的代码必须被取缔。。。但是如果有人只在编译器不知道的其他板条箱中添加复杂的impl Float
最后一点是关键:与Haskell不同,Rust的设计允许此代码完全正常,没有任何风险,这一切都是因为Rust处理最后一点的方式不同。如果你在一个能看到一种类型类型
和一种特质特质
的板条箱里,那么你100%肯定类型
是否实现了特质
:Rust没有Haskell的开放世界假设,因为只有当Trait
或Type
位于当前板条箱(编译单元)中时,您才能为Type编写impl Trait,也就是说,您不能在某个遥远的板条箱中为Complex
实现Float
RFC 24(Chris链接到),允许这些通用实现与更具体的实现共存,只要保证实现不重叠。这在实现时是可能的复杂的比T
更“专业化”呢?这不算什么吗?对不起,但是又是什么原因导致了这种行为,包括过载解决方案?请帮助C++程序员理解锈蚀设计的选择。例如,您需要有某种方法来解决将哪个impl
用于(uint,uint)
给定impl-Trait for(uint,T)
和impl-Trait for(T,uint)
。从哲学上讲,Haskell的系统是类似的,您需要通过语言扩展明确地选择这些类型的impl
s,但是,那里的主要问题不一定适用于Rust(与本答案中描述的问题相同)。未来(长期)可能会增加某种形式的impl
特异性。