Даже если &T
определено как реализация признака Fn
, компилятор отклоняет его, когда вызывает его как вызываемый:
trait Trait {
fn act(self);
}
//passes
fn test_ref_input_as_trait<'a, T>(t: &'a T)
where
&'a T: Trait,
{
t.act();
}
//fails
fn test_ref_input_as_fntrait<'a, T>(t: &'a T)
where
&'a T: Fn(),
{
t();
}
//passes
fn test_input_as_fntrait<T>(t: T)
where
T: Fn(),
{
t();
}
Компилятор отклоняет определение второй функции с помощью:
error[E0618]: expected function, found `&'a T`
--> src/lib.rs:18:5
|
14 | fn test_ref_input_as_fntrait<'a, T>(t: &'a T)
| - `&'a T` defined here
...
18 | t();
| ^^^ not a function
С nightly (1.32) сообщение об ошибке заменяется на:
error[E0618]: expected function, found `&'a T`
--> src/lib.rs:18:5
|
14 | fn test_ref_input_as_fntrait<'a, T>(t: &'a T)
| - `&'a T` defined here
...
18 | t();
| ^--
| |
| call expression requires function
Возможно, я что-то упускаю, но почему компилятор принимает определение, но не разрешает егобыть вызванным?Это синтаксический недостаток с моей стороны, который заставляет его понять что-то еще?