相关疑难解决方法(0)

实现嵌套特征

我有一些特征(删除函数和一些参数膨胀后)看起来像:

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(希望没有任何动态调度)中做到这一点?

编辑:有些人暗示了一些类似的问题,基本上有两种方法(我发现它们都不适合我的情况):

  1. 使用关联类型.我不想这样做,因为我要跟踪的T,例如我想写一些功能,这有这样一个签名fn bla<T: Foo, U: Bar<T>, V: …

traits rust

10
推荐指数
1
解决办法
628
查看次数

如何为一般的右手操作数重载操作符?

我有一个泛型类型,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>); 只有当前包中定义的特征可以为类型参数实现

使用您自己的类型作为右侧操作数重载运算符的标准方法是什么?

[编辑]

显然答案是你目前无法做到这一点."重复"中的相关问题有一些答案.我等待语言的更新,以便可以重新打开这个问题,并且可以给出实际的答案.

generics operator-overloading traits rust

7
推荐指数
0
解决办法
274
查看次数

如何限制 Rust 中特征的通用实现?

作为学习 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)

我想要一个通用的变异器,它能够变异每个HasVectorGenomeBaseType实现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 …

generics rust

5
推荐指数
1
解决办法
3872
查看次数

为自定义特征提供毯子特征实现

我采取的做法迅速几何箱子,我想实现两个结构,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,VectorNormal …

rust

4
推荐指数
1
解决办法
1688
查看次数

标签 统计

rust ×4

generics ×2

traits ×2

operator-overloading ×1