gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:02:21 24 4
gpt4 key购买 nike

即使 &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

也许我遗漏了什么,但为什么编译器接受定义但不允许调用它?是我这边的句法缺陷导致它理解别的东西吗?

最佳答案

有一个open issue (#42736)对这个。然而,docs for Fn状态:

for any type F that implements Fn, &F implements Fn, too.

这意味着以下工作:

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

关于rust - 为什么对实现 Fn 的类型的引用不被识别为可调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53627979/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com