Próbuję użyć funkcji wywołania zwrotnego na obiekcie cechy. I zmniejszona mój problem z następującym kodem (playpen):Korzystanie z wywołań zwrotnych na obiektach obiektów
trait Caller {
fn call(&self, call: fn(&Caller)) where Self: Sized {
call(self)
}
}
struct Type;
impl Caller for Type {}
fn callme(_: &Caller) {}
fn main() {
let caller: Box<Caller> = Box::new(Type);
caller.call(callme); // does not work
//callme(&*caller); // works
}
co skutkuje
<anon>:14:12: 14:24 error: the trait `core::marker::Sized` is not implemented for the type `Caller` [E0277]
<anon>:14 caller.call(callme); // does not work
^~~~~~~~~~~~
Dodawanie Sized
związany Caller
wyniki w:
<anon>:3:14: 3:18 error: cannot convert to a trait object because trait `Caller` is not object-safe [E0038]
Naprawdę nie wiem zrozum, dlaczego potrzebuję Sized
związanej z cechą. Funnily to działa, jeśli używam wywołania zwrotnego bezpośrednio. Jak mogę to uruchomić?
Edit: Dzięki odpowiedź I teraz pojawił się z miłym rozwiązania
trait Caller {
fn borrow(&self) -> &Caller;
fn call(&self, call: fn(&Caller)) {
call(self.borrow())
}
}
struct Type;
impl Caller for Type {
fn borrow(&self) -> &Caller { self }
}
fn callme(_: &Caller) {}
fn main() {
let caller: Box<Caller> = Box::new(Type);
caller.call(callme);
}
Jedna rzecz, której wciąż nie jestem pewien po przeczytaniu tego - czy istnieje sposób na sprawienie, aby kod OP działał? – Shepmaster
Err, tak, zapomniałem odpowiedzieć na pytanie. :) – huon
Dziękuję, ale nie rozumiem, dlaczego nie można przekształcić & Self na & Caller. Czy nie powinna to być tylko transformacja tożsamości, ponieważ & Self jest już & Caller? Edycja: Odpowiedź jest prawdopodobnie taka, że & Self nie jest & Caller, ale może być czymś innym, ale brzmi jak powinno być naprawiane w rustc. – Ferio