这里的代码
trait Foo {
type Output;
fn foo(self) -> Self::Output;
}
impl<'a> Foo for &'a () {
type Output = &'a ();
fn foo(self) -> Self::Output {
self
}
}
fn func<F: Foo>(f: F) -> F::Output {
f.foo()
}
fn func2<'a>(f: &'a ()) -> &'a () {
func::<&'a ()>(f)
}
fn has_hrl<F: Fn(&()) -> &()>(f: F) {}
fn main() {
//has_hrl(func); // FAILS
has_hrl(func2);
has_hrl(|x| func(x));
}
我们想做 has_hrl(func)
,但 Rust 只接受闭包 has_hrl(|x| func(x))
。这是为什么?因为它适用于具体类型,例如 func2
,但不适用于泛型。
最佳答案
在这个表达式中:
has_hrl(func)
编译器被迫选择 func
的一个特定实例. func
在 F: Foo
上通用, 以及所有 'a
, &'a ()
工具 Foo
, 但编译器只能选择一个特定的 'a
实例化 func
,因为类型变量不能表示多种类型。因此,func::<&'a ()>
不执行 for<'a> Fn(&'a ()) -> &'a ()
, 它只实现了 Fn(&'x ()) -> &'x ()
一个特定的生命周期'x
.
This would work if you declared
has_hrl
likefn has_hrl<'a, F: Fn(&'a ()) -> &'a ()>(_: F) {}
. My power level is insufficient to explain why the lifetime needs to be explicit, though. – ljedrz
那是因为原始声明具有隐含的更高级别的生命周期边界(该边界等同于 F: for<'a> Fn(&'a ()) -> &'a ()
),这意味着 F
必须实现 Fn(&'a ()) -> &'a ()
对于所有 生命周期'a
.您的版本只需要 F
实现Fn(&'a ()) -> &'a ()
一个具体的一生。如果 has_hrl
,您还会发现此版本不起作用尝试使用 has_hrl
的本地生命周期调用闭包函数,因为调用者不可能将该生命周期作为参数传递(这就是引入更高级别生命周期界限的原因)。
关于rust - 更高等级的生命周期和泛型表现不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39558633/