必须指定哪个通用参数?

时间:2015-11-06 14:59:56

标签: generics rust

我遇到了一个问题,我有这个特性(省略了一些事情):

use rand::Rng;
pub trait GeneticAlgorithm<R, Ins, C> : Clone where R: Rng {
    fn call<F>(&self, program: F) where F: FnOnce(&C);
}

此结构实现了特征:

pub struct Mep<Ins> {
    instructions: Vec<Ins>,
    unit_mutate_size: usize,
    crossover_points: usize,
}

impl<R, Ins> GeneticAlgorithm<R, Ins, Vec<Ins>> for Mep<Ins> where R: Rng, Ins: Clone {
    fn call<F>(&self, program: F) where F: FnOnce(&Vec<Ins>) {
        program(&self.instructions);
    }
}

在测试中我试图运行它:

let mut rng = Isaac64Rng::from_seed(&[1, 2, 3, 4]);
let (a, b) = {
    let mut clos = || Mep::new(3, 3, rng.gen_iter::<u32>().map(|x| x % 10).take(10));
    (clos(), clos())
};
let mut c = Mep::mate((&a, &b), &mut rng);
c.call(|x: &Vec<u32>| panic!());

Rust声称它无法在某处推断出某种类型,但我不知道如果这是问题,如何指定闭包的类型,我也无法确定哪个特定的泛型参数导致了这个问题:

error: unable to infer enough type information about `_`; type annotations or generic parameter binding required [E0282]
c.call(|x: &Vec<u32>| panic!());

需要指定哪个通用参数?

如果有人想自己构建代码,我就是hosting it on GitHub

1 个答案:

答案 0 :(得分:3)

让我们看一下你的宣言,为了清晰起见,修剪一下:

pub trait GeneticAlgorithm<R, Ins, C> {
    fn call<F>(&self, program: F);
}

此处有4种通用类型:RInsCF。现在,让我们看看你的实现(再次,修剪):

impl<R, Ins> GeneticAlgorithm<R, Ins, Vec<Ins>> for Mep<Ins> {
    fn call<F>(&self, program: F);
}

因此,您现在已经为C提供了取决于Ins的具体值。您仍有3个参数需要用户指定:InsFR

根据闭包类型,在调用函数时将指定

F。在创建Ins结构时将指定Mep

离开R基于这些声明R应该是什么?这是不可能的。这似乎只是您实施中的错误;你应该把它放在某个地方。另一个选择是您只需要一个不需要的参数。