2015-11-06 2 views
1

я столкнулся с вопросом, где у меня есть эта черта (некоторые вещи опущенные):Какой общий параметр должен быть указан?

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 утверждает, что он не может вызывать тип где-то, но я не уверен, как указать тип закрытия, если это проблема, и я не могу определить, какой h специфический общий параметр вызывает проблему:

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.

ответ

3

Давайте посмотрим на вашей декларации, отделанные немного для ясности:

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

Есть 4 универсальных типа здесь: R, Ins, C и F. Теперь давайте посмотрим на вашей реализации (опять же, обрезается):

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

Итак, вы уже представили конкретное значение C, которое зависит от Ins. У вас все еще есть 3 параметра, которые должен указать: Ins, F и R.

F будет указан при вызове функции, основанной на типе замыкания. Ins будет указываться при создании структуры Mep.

Это оставляет R. На основании этих объявлений, что такое R Предполагалось, что? Это невозможно сказать. Это, по-видимому, является ошибкой в ​​вашей реализации; скорее всего, вы должны иметь его где-то. Другой вариант заключается в том, что у вас просто есть параметр, который вам не нужен.

Смежные вопросы