rust - 闭包和 Higher-Ranked-Trait-Bounds 生命周期问题

标签 rust

我正在尝试更高级别的特征界限。在我创建的一个最小示例中,有一个函数采用闭包,它采用 &str并返回 &str同生命周期'a .我在 Fn 上明确声明了生命周期特征。

fn foo(_: &for<'a> Fn(&'a str) -> &'a str) {
}

fn main() {
    foo(&|s| s);
}

这工作正常。如果我将闭包中的参数类型注释为 &str ,我收到一个终身错误:
fn foo(_: &for<'a> Fn(&'a str) -> &'a str) {
}

fn main() {
    foo(&|s: &str| s); // explicitly specified parameter type
}

这让我很困惑。有几个原因。
  • 闭包的返回类型不是被推断为与
    参数(通过生命周期省略具有相同的生命周期)?
  • foo 的论点在所有可能的情况下被普遍量化
    一生。为什么生命周期的类型不能是任意的?不是吗'a只是一辈子的占位符?

  • 它可以在没有明确指定类型的情况下工作,但为什么呢?这两个版本有何不同?

    playpen code

    最佳答案

    在当前版本的 Rust 编译时没有警告:

    fn foo<T>(_: &T) where
    T: for<'a> Fn(&'a str) -> &'a str
    {
    }
    
    fn main() {
        foo(&|s: &str| s); // explicitly specified parameter type
    }
    

    关于rust - 闭包和 Higher-Ranked-Trait-Bounds 生命周期问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33364403/

    相关文章:

    macros - 定义特征别名的宏

    variables - 将 "mut"放在变量名之前和 ":"之后有什么区别?

    rust - 为什么我会收到错误 E0277 : the size for values of type `[{integer}]` cannot be known at compilation time?

    file - 如何等到文件在 Rust 中创建?

    将简单的 C#define 转换为 Rust 常量

    rust - 如何在Rust中获取本地时区名称?

    types - 函数是否可以根据函数中的条件语句返回不同的类型?

    asynchronous - 相互调用的递归异步函数 : cycle detected

    rust - 尝试从包含在 RefCell 中的结构中借用 2 个字段时出错

    input - 在使用 print! 的示例中可以简化!冲洗?