我有一些特征(删除函数和一些参数膨胀后)看起来像:
trait Foo { }
trait Boo { }
trait Bar<T: Foo> { }
trait Baz { }
Run Code Online (Sandbox Code Playgroud)
如果U实现Bar<T>了一些T实现Foo 和 U实现Boo,那么就可以派生Bazfor 的实现U.但是,我无法编写有效的Rust代码.
几次尝试是:
impl<T: Foo, U: Bar<T> + Boo> Baz for U { }
Run Code Online (Sandbox Code Playgroud)
这使
错误:类型参数
T不受impl trait,self type或谓词约束[E0207]
而
impl<U: Bar<T> + Boo> Baz for U { }
Run Code Online (Sandbox Code Playgroud)
产量
错误:类型名称
T未定义或未在范围内[E0412]
一个/怎么可能在(稳定)Rust(希望没有任何动态调度)中做到这一点?
编辑:有些人暗示了一些类似的问题,基本上有两种方法(我发现它们都不适合我的情况):
T,例如我想写一些功能,这有这样一个签名fn bla<T: Foo, U: Bar<T>, V: …我有一个泛型类型,Vec2<T>我想为此实现以下操作:
Vec2<T> = T * Vec2<T>
我试过这个:
impl<T: Copy + Mul<Output = T>> Mul<Vec2<T>> for T {
type Output = Vec2<T>;
fn mul(self, rhs: Vec2<T>) -> Vec2<T> {
Vec2 {
x: self * rhs.x,
y: self * rhs.y,
}
}
}
Run Code Online (Sandbox Code Playgroud)
但我得到这个错误:
type参数
T必须用作某些本地类型的类型参数(例如MyStruct<T>); 只有当前包中定义的特征可以为类型参数实现
使用您自己的类型作为右侧操作数重载运算符的标准方法是什么?
[编辑]
显然答案是你目前无法做到这一点."重复"中的相关问题有一些答案.我等待语言的更新,以便可以重新打开这个问题,并且可以给出实际的答案.
作为学习 Rust 的借口,我正在研究遗传算法的代码,以及稍后的遗传编程。
我声明了突变操作的一个特征:
pub trait Mutator<IndvidualType> {
fn mutate(&self, individual: &IndvidualType) -> IndvidualType;
}
Run Code Online (Sandbox Code Playgroud)
为每个 实现该特征很容易IndividualType,但我想要更通用的东西,这是每个列表(向量)类型基因组所共有的特征,例如:
pub trait HasVectorGenome<IndividualType, BaseType> {
fn new_from_vec(genome: Vec<BaseType>) -> IndvidualType;
fn get_vec(&self) -> Vec<BaseType>;
}
Run Code Online (Sandbox Code Playgroud)
我想要一个通用的变异器,它能够变异每个HasVectorGenome其BaseType实现Rand(以便能够生成新的随机值)。就像是:
struct GeneralMutator;
impl<B, T> Mutator<T> for GeneralMutator
where T: HasVectorGenome<T, B>,
B: Rand
{
fn mutate(&self, individual: &T) -> T {
let genome: Vec<B> = individual.get_vec();
genome[0] = rand::random::<B>();
T::new_from_vec(genome)
}
}
Run Code Online (Sandbox Code Playgroud)
我遇到了错误the type parameter `B` is not …
我采取的做法迅速几何箱子,我想实现两个结构,Vector以及Normal(这是因为标准的矢量和法向矢量地图通过一定的转换不同).我已经实现了以下特征:
trait Components {
fn new(x: f32, y: f32, z: f32) -> Self;
fn x(&self) -> f32;
fn y(&self) -> f32;
fn z(&self) -> f32;
}
Run Code Online (Sandbox Code Playgroud)
我也想将两个向量加在一起,以及两个法线,所以我有块看起来像这样:
impl Add<Vector> for Vector {
type Output = Vector;
fn add(self, rhs: Vector) -> Vector {
Vector { vals: [
self.x() + rhs.x(),
self.y() + rhs.y(),
self.z() + rhs.z()] }
}
}
Run Code Online (Sandbox Code Playgroud)
impl对于Normals 几乎完全相同.我真正想要的是Add impl为每个实现的结构提供一个默认值Components,因为通常它们都将以相同的方式添加(例如,第三个被调用的结构Point将执行相同的操作).是否有这样做除了用于写出三个相同实现的方式Point,Vector和Normal …