rust - 更高等级的生命周期和泛型表现不佳

标签 rust closures traits lifetime

这里的代码

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 的一个特定实例. funcF: 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 like fn 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/

相关文章:

javascript - CoffeeScript 中的动态类生成

java - Groovy traits 是否支持与 Java 联合编译?

split - 在 Rust 中将拆分解包为元组?

unit-testing - 有没有一种方法可以更轻松地调试失败的、非终止的测试?

rust - 在固有实现的上下文中, "nominal type"是什么?

rust - 有没有办法选择两个生命周期中较小的一个?

java - Groovy:什么是 java stream anyMatch 的模拟

rust - 如何在检查相同值的循环中使用可变捕获变量的闭包?

multithreading - 克隆和移动特征

rust - 在特征实现的上下文中理解 'self' 参数