У меня есть такая структура:
pub struct ImmEval<Out> {
closure: Rc<dyn Fn(&Self) -> Out>
}
impl<Out> From<Rc<dyn Fn(&Self) -> Out>> for ImmEval<Out> {
/// Constructs the evaluator from the specified closure.
fn from(cl: Rc<dyn Fn(&Self) -> Out>) -> Self {
ImmEval {closure: cl}
}
}
impl<Out> Evaluator for ImmEval<Out> {
type Output = Out;
/// Evaluates and returns the result.
fn eval(&self) -> Self::Output {
(*self.closure)(self)
}
}
, которая используется в таком тесте:
let counter = Cell::new(0);
{
let eval = ImmEval::<i32>::from(Rc::from(|_: &ImmEval<i32>| {
counter.set(counter.get() + 1);
counter.get()
}));
eval.eval();
eval.eval();
}
assert_eq!(counter.get(), 2);
Структура сама компилируется, а тест - нет. Вместо этого происходит сбой со следующим rustc
сообщением:
error[E0277]: the trait bound `ImmEval<i32>: std::convert::From<std::rc::Rc<[closure@src\tests.rs:8:51: 11:10 counter:_]>>` is not satisfied
--> src\tests.rs:8:41
|
8 | let eval = ImmEval::<i32>::from(Rc::from(|_: &ImmEval<i32>| {
| _________________________________________^
9 | | counter.set(counter.get() + 1);
10 | | counter.get()
11 | | }));
| |__________^ the trait `std::convert::From<std::rc::Rc<[closure@src\tests.rs:8:51: 11:10 counter:_]>>` is not implemented for `ImmEval<i32>`
|
= help: the following implementations were found:
<ImmEval<Out> as std::convert::From<std::rc::Rc<(dyn for<'r> std::ops::Fn(&'r ImmEval<Out>) -> Out + 'static)>>>
= note: required by `std::convert::From::from`
Конечно, это означает, что мое закрытие не является действительным Fn(&ImmEval<i32>) -> i32
, но почему?
Вот пример детской площадки .