Я немного зациклен на том, как заставить это работать, я отрезал его от реальной вещи. Я написал черту:Передача метода закрытия: метод ожидаемого типа, найдено закрытие
pub trait Renderable<F: Fn(&PropertyTags)> {
fn set_property_changed_callback(&mut self, callback: Option<F>);
}
Какой параметр «ребенок» из add_child
ограничена из и PropertyTags
это просто перечисление. Я включил имитировали реализации типа child
, чтобы продемонстрировать свое использование:
pub struct Child<F: Fn(&PropertyTags)> {
property_changed_callback: Option<F>,
}
impl<F: Fn(&PropertyTags)> Renderable<F> for Child<F> {
fn set_property_changed_callback(&mut self, callback: Option<F>) {
self.property_changed_callback = callback;
}
}
Тогда они будут использоваться как:
pub fn add_child<REND, C>(&mut self, child: &mut REND)
where C: Fn(&PropertyTags),
REND: Renderable<C>
{
let tc = Some(|property_tag: &PropertyTags|{
});
child.set_property_changed_callback(tc);
}
я получаю ошибку:
child.set_property_changed_callback(tc);
| ^^ expected type parameter, found closure
|
= note: expected type `std::option::Option<C>`
= note: found type `std::option::Option<[[email protected]/rendering/mod.rs:74:31: 76:18]>`
= help: here are some functions which might fulfill your needs:
- .take()
- .unwrap()
Я установил минимальный пример игровой площадки, где воспроизводятся следующие проблемы: https://play.rust-lang.org/?gist=bcc8d67f25ac620fe062032d8737954b&version=stable&backtrace=0
Прошу прощения, если это дубликат, я прочитал кучу подобных вопросов, но ни один из них не помог мне исправить это. –
Вам нужно будет добавить больше кода, чтобы мы могли его протестировать. А пока вы видели [этот вопрос] (http://stackoverflow.com/questions/36414576/returning-a-closure-from-a-trait-method-involving-generics-in-rust)? Вероятно, вам нужно закрыть закрытие в «Коробке». – ljedrz
Я не был уверен, что это была та же проблема, поскольку они пытались вернуть закрытие. Я надеялся избежать бокса, я был под впечатлением, что это сделало бы его динамически отправленным? –