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();
}