相关疑难解决方法(0)

如何限制 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
查看次数

如何将1加到通用T?

下面是一个通用类型Foo。如何正确实现该addOne方法:

struct Foo<T> {
    n: T,
}

impl<T> Foo<T> {
    fn addOne(self) -> T {
        self.n + 1
    }
}

fn main() {
    let a = Foo { n: 5 };
    println!("{}", a.addOne());
}
Run Code Online (Sandbox Code Playgroud)

我期望输出为6,但是此代码无法编译:

struct Foo<T> {
    n: T,
}

impl<T> Foo<T> {
    fn addOne(self) -> T {
        self.n + 1
    }
}

fn main() {
    let a = Foo { n: 5 };
    println!("{}", a.addOne());
}
Run Code Online (Sandbox Code Playgroud)

rust

2
推荐指数
1
解决办法
83
查看次数

标签 统计

rust ×2

generics ×1