Rust 为什么对实现Fn的类型的引用不能被识别为可调用的?

Rust 为什么对实现Fn的类型的引用不能被识别为可调用的?,rust,traits,callable,Rust,Traits,Callable,即使&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) whe

即使
&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();
}
trait{
fn法(自我);
}
//通行证
fn测试参考输入作为特征(t:&'a t)
哪里
&'at:Fn(),
{
t();
}
//通行证
fn测试输入为fn特征(t:t)
哪里
T:Fn(),
{
t();
}
编译器拒绝第二个函数的定义,其中包含:

error[E0618]:应为函数,找到`&'T`
-->src/lib.rs:18:5
|
14 | fn测试参考输入作为特征src/lib.rs:18:5
|
14 | fn test _ref _input _as _fntrait这可能是一个bug(例如,如果您用
(&'a T,)
替换
,它就会工作)。但是,您可以这样调用函数:

fn test_ref_input_as_fntrait<'a, T>(t: &'a T)
where
    &'a T: Fn(),
{
    (&t)();
}
关于这一点,有一个很好的解释。然而,国家:

对于实现
Fn
的任何类型的
F
&F
也实现
Fn

这意味着以下工作:

fn test_ref_input_as_fntrait<'a, T>(t: &'a T)
where
    T: Fn(),
{
    t();
}

fn test\u ref\u input\u as\u fntraitAfaik这样的函数不能有引用。可以说,函数应该与
fn foo(t:t){t()}
fn test_ref_input_as_fntrait<'a, T>(t: &'a T)
where
    T: Fn(),
{
    t();
}