"one type is more general than the other" Rust 在类型相同时出错
"one type is more general than the other" error in Rust while types are identical
我有以下代码
use std::future::Future;
fn main() {
handle(Test::my_func);
}
fn handle<Fut>(fun: for<'r> fn(&'r mut Test) -> Fut) -> bool
where
Fut: Future<Output = ()>,
{
true
}
struct Test {}
impl Test {
pub async fn my_func<'r>(&'r mut self) -> () {
()
}
}
此外,您可以 运行 在 Rust Playground 上在线阅读。
出现以下错误:
error[E0308]: mismatched types
--> src/main.rs:4:12
|
4 | handle(Test::my_func);
| ^^^^^^^^^^^^^ one type is more general than the other
...
17 | pub async fn my_func<'r>(&'r mut self) -> () {
| -- checked the `Output` of this `async fn`, found opaque type
|
= note: while checking the return type of the `async fn`
= note: expected fn pointer `for<'r> fn(&'r mut Test) -> impl Future`
found fn pointer `for<'r> fn(&'r mut Test) -> impl Future`
error: aborting due to previous error
For more information about this error, try `rustc --explain E0308`.
error: could not compile `playground`
To learn more, run the command again with --verbose.
现在,这真的很奇怪,因为它清楚地表明它得到了预期的结果。我不明白哪种类型比哪种类型更通用。我对生命周期的了解不足以调试此代码。有人可以对此进行更深入的了解吗?
有时您可以从夜间编译器中得到更好的错误:
16 | pub async fn my_func<'r>(&'r mut self) -> () {
| ^^ checked the `Output` of this `async fn`, found opaque type
= note: expected fn pointer `for<'r> fn(&'r mut Test) -> impl Future`
found fn pointer `for<'r> fn(&'r mut Test) -> impl for<'r> Future`
简单来说,这意味着您期望 fun
是一个函数,其中 returns 是一个实现 Future
特征的结构,但具有隐式 + 'static
绑定,这意味着该结构不能具有仅在 'r
.
期间有效的字段
然而,Test::my_func
确实想要引用 &mut 'r self
,因此该程序被编译器拒绝。
你可以想象像 for<'r> fn(&'r mut Test) -> (impl Future + 'r)
这样的东西,但目前 rustc
不接受这种东西,据我所知没有任何方法可以做到这一点(没有不安全或装箱的一切)。
根据您的用例,您可能能够逃脱:
fn handle<'a, Fut>(fun: impl Fn(&'a mut Test) -> Fut) -> bool
where
Fut: Future<Output = ()> + 'a,
{
true
}
这是可行的,因为我们需要一个生命周期 ('a
),我们可以为 Fut: Future<Output = ()> + 'a
边界命名,而不是我们无法命名的任何生命周期 (for<'r> ..
)那个界限,
但这要严格得多。
我有以下代码
use std::future::Future;
fn main() {
handle(Test::my_func);
}
fn handle<Fut>(fun: for<'r> fn(&'r mut Test) -> Fut) -> bool
where
Fut: Future<Output = ()>,
{
true
}
struct Test {}
impl Test {
pub async fn my_func<'r>(&'r mut self) -> () {
()
}
}
此外,您可以 运行 在 Rust Playground 上在线阅读。
出现以下错误:
error[E0308]: mismatched types
--> src/main.rs:4:12
|
4 | handle(Test::my_func);
| ^^^^^^^^^^^^^ one type is more general than the other
...
17 | pub async fn my_func<'r>(&'r mut self) -> () {
| -- checked the `Output` of this `async fn`, found opaque type
|
= note: while checking the return type of the `async fn`
= note: expected fn pointer `for<'r> fn(&'r mut Test) -> impl Future`
found fn pointer `for<'r> fn(&'r mut Test) -> impl Future`
error: aborting due to previous error
For more information about this error, try `rustc --explain E0308`.
error: could not compile `playground`
To learn more, run the command again with --verbose.
现在,这真的很奇怪,因为它清楚地表明它得到了预期的结果。我不明白哪种类型比哪种类型更通用。我对生命周期的了解不足以调试此代码。有人可以对此进行更深入的了解吗?
有时您可以从夜间编译器中得到更好的错误:
16 | pub async fn my_func<'r>(&'r mut self) -> () {
| ^^ checked the `Output` of this `async fn`, found opaque type
= note: expected fn pointer `for<'r> fn(&'r mut Test) -> impl Future`
found fn pointer `for<'r> fn(&'r mut Test) -> impl for<'r> Future`
简单来说,这意味着您期望 fun
是一个函数,其中 returns 是一个实现 Future
特征的结构,但具有隐式 + 'static
绑定,这意味着该结构不能具有仅在 'r
.
然而,Test::my_func
确实想要引用 &mut 'r self
,因此该程序被编译器拒绝。
你可以想象像 for<'r> fn(&'r mut Test) -> (impl Future + 'r)
这样的东西,但目前 rustc
不接受这种东西,据我所知没有任何方法可以做到这一点(没有不安全或装箱的一切)。
根据您的用例,您可能能够逃脱:
fn handle<'a, Fut>(fun: impl Fn(&'a mut Test) -> Fut) -> bool
where
Fut: Future<Output = ()> + 'a,
{
true
}
这是可行的,因为我们需要一个生命周期 ('a
),我们可以为 Fut: Future<Output = ()> + 'a
边界命名,而不是我们无法命名的任何生命周期 (for<'r> ..
)那个界限,
但这要严格得多。