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仍然告诉我“没有借用值”?
来自编译器的关键信息的确是缺少用于返回字符串的闭包的生存期说明符。由于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] 删除。
我来说两句