Ich versuche, eine Schließung, die ein &Any
als Argument zurückgibt. Der folgende Code gibt einen Compilerfehler zurück.Nicht-skalare Besetzung: `Box <FnMut<&Any>>`
trait Selector {
fn id(&self) -> i64;
fn selector(&self) -> Box<FnMut(&Any, &mut Any)>;
}
struct TypedSelector<TSource, TTarget> {
id: i64,
select: Box<FnMut(&TSource, &mut TTarget)>,
}
impl<TSource, TTarget> Selector for TypedSelector<TSource, TTarget>
where TSource: 'static,
TTarget: 'static
{
fn id(&self) -> i64 {
self.id
}
fn selector(&self) -> Box<FnMut(&Any, &mut Any)> {
self.select as Box<FnMut(&Any, &mut Any)>
}
}
Der Compiler-Fehler ist folgende:
error: non-scalar cast: `Box<for<'r, 'r> std::ops::FnMut(&'r TSource, &'r mut TTarget) + 'static>` as `Box<for<'r, 'r> std::ops::FnMut(&'r std::any::Any + 'static, &'r mut std::any::Any + 'static)>`
--> src\main.rs:190:9
|
190 | self.select as Box<FnMut(&Any, &mut Any)>
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Bin ich ein paar Typenannotationen fehlt?
Ich weiß, was 'unwrap' verlockend ist, aber es könnte am besten sein, Neulinge zu lehren' statt expect' zu verwenden. Es macht schließlich diagnostizieren, was schief gelaufen ist. –
@MatthieuM. Guter Punkt, aktualisiert. –