rust - 闭包不能返回引用吗?

标签 rust

fn main() {
    let a = String::from("foo");
    let f = || &a;
    fn_immut(f);
    println!("{}", a);
}

fn fn_immut<F>(f: F)
               where F: Fn() -> &String
{
    println!("calling Fn closure from fn, {}", f());
}


这段代码无法编译,rustc告诉我应该添加一个'static,如下所示:

fn fn_immut<F>(f: F)
               where F: Fn() -> &'static String

我试图这样做,但仍然无法正常工作。而且rustc也告诉我“此函数的返回类型包含借入的值,但没有要借用的值”。

我的问题是:在这段代码中,闭包已经在其作用域内捕获了a变量的引用,为什么rustc仍然告诉我“从中借用没有任何值(value)”?

最佳答案

来自编译器的关键消息确实是缺少用于返回字符串的闭包的生存期说明符。由于特征Fn() -> &String定义的签名没有任何函数参数,因此没有任何值可让编译器从中推断出返回引用的生存期。

error[E0106]: missing lifetime specifier
  --> src/main.rs:10:16
   |
10 |     F: Fn() -> &String,
   |                ^ help: consider giving it a 'static lifetime: `&'static`
   |
   = help: this function's return type contains a borrowed value, but there is no value for it to be borrowed from

在此处添加'static并不能解决问题,因为实际上返回的字符串不会具有该生存期。需要在fn_immut中引入一个新的生存期参数,从中可以将其转换为F的约束。
fn fn_immut<'a, F>(f: F)
where
    F: Fn() -> &'a String,

您还可以返回字符串切片(&str)而不是&String。完整代码:

fn main() {
    let a = String::from("foo");
    let f = || &*a;
    fn_immut(f);
    println!("{}", a);
}

fn fn_immut<'a, F>(f: F)
where
    F: Fn() -> &'a str,
{
    println!("calling Fn closure from fn, {}", f());
}

Playground

关于rust - 闭包不能返回引用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60464422/

相关文章:

macros - 是否可以让宏扩展为结构字段?

pattern-matching - Rust: "cannot move out of ` self` 因为它是借来的”错误

rust - 什么是非词汇生命周期?

generics - 解析数字的通用函数因 "FromStr is not implemented"而失败

使用 clone_from_slice() 而不是 copy_from_slice() 的性能损失?

rust - 如何使用 cargo publish 发布优化的二进制文件?

rust - 使用人造丝并行迭代器时的同步和发送特征

rust - 实现 Deref 特征时无法为生命周期参数推断出合适的生命周期

rust - 如何为 x86_64-unknown-linux-musl 构建依赖于 curl 的可执行文件

rust - 错误 "cannot move out of borrowed content"的来源是什么?