闭包不能返回引用吗?

三木
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仍然告诉我“没有借用值”?

E_net42

来自编译器的关键信息的确是缺少用于返回字符串的闭包的生存期说明符。由于trait定义的签名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,

您也可以返回字符串slice(&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());
}

操场

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何从闭包返回对闭包参数的引用?

来自分类Dev

是否可以从PHP的闭包返回引用?

来自分类Dev

JavaScript闭包返回NaN吗?

来自分类Dev

JavaScript闭包返回NaN吗?

来自分类Dev

我可以让#selector引用Swift中的闭包吗?

来自分类Dev

从函数返回闭包

来自分类Dev

从函数返回闭包

来自分类Dev

如何将可变引用捕获到从闭包返回的迭代器中包含的移动闭包中

来自分类Dev

闭包是通过引用捕获的?

来自分类Dev

可以在没有显式引用的情况下引用结构的闭包属性吗?

来自分类Dev

使用vapply返回闭包

来自分类Dev

返回可变环境的闭包

来自分类Dev

闭包返回类型语法

来自分类Dev

从SwiftUI的闭包返回视图

来自分类Dev

返回闭包的变量是创建一个副本而不是一个引用

来自分类Dev

如何向闭包添加生命周期参数而不返回引用

来自分类Dev

从函数内的闭包内的闭包中返回数据

来自分类Dev

返回函数与返回闭包

来自分类Dev

我从闭包返回的函数在外部范围中可用吗?

来自分类Dev

闭包如何存储对常量或值的引用

来自分类Dev

闭包中变量引用的异常行为

来自分类Dev

在Swift中对闭包的引用很少

来自分类Dev

双闭包如何破坏循环引用?

来自分类Dev

双闭包如何破坏循环引用?

来自分类Dev

停止在闭包中通过引用传递

来自分类Dev

Lua:函数闭包是局部函数吗?

来自分类Dev

这是javascript闭包的示例吗

来自分类Dev

Lua:函数闭包是局部函数吗?

来自分类Dev

JavaScript闭包返回递归函数