在这里的代码中:
我们希望使用
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
,就可以正常工作:fn has_hrl<'a, F: Fn(&'a ()) -> &'a ()>(_: F) {}
。虽然我无法解释为什么生命周期需要显式声明。 - ljedrz