gpt4 book ai didi

rust - Option::map 参数的生命周期

转载 作者:行者123 更新时间:2023-11-29 07:59:09 24 4
gpt4 key购买 nike

我将一个字符串放入 Option并尝试映射它,例如修剪字符串:

fn main() {
let s = " i want to be trimmed ".to_string();
let s_opt = Some(s);

let x = s_opt.map(|z| z.trim());
// let x = s_opt.map(|z| z.trim().to_string());

println!("'{:?}'", x);
}

编译器显示生命周期错误

error[E0597]: `z` does not live long enough
--> src/main.rs:5:27
|
5 | let x = s_opt.map(|z| z.trim());
| ^ - `z` dropped here while still borrowed
| |
| borrowed value does not live long enough
...
9 | }
| - borrowed value needs to live until here

这很清楚,因为 z仅在闭包中定义,参数按值传递。

由于原始变量s为整个 block 而活,编译器不应该能够弄清楚z吗?实际上是 s

我能让它工作的唯一方法是添加 to_string (请参阅注释行),但随后我创建了一个新的字符串对象。

我找到的另一个解决方案是制作 s_opt一种 Option<&String> (参见第二个代码块),但由于函数不能返回这种类型,所以这不是一个真正的选择。

fn main() {
let s = " i want to be trimmed ".to_string();
let s_opt = Some(&s);

let x = s_opt.map(|z| z.trim());
println!("'{:?}'", x);
}

有没有我忽略的东西,或者如果 map 的默认实现不是更好吗?会和这个类似吗?

fn my_map<'r, F>(o: &'r Option<String>, f: F) -> Option<&'r str>
where
F: Fn(&'r String) -> &'r str,
{
match *o {
None => None,
Some(ref x) => Some(f(x)),
}
}

fn main() {
let s = " i want to be trimmed ".to_string();
let s_opt = Some(s);

let x = my_map(&s_opt, |x| x.trim());
println!("'{:?}'", x);
}

最佳答案

map 函数使用迭代值,因此它们在调用给定闭包后不再存在。您不能返回对它们的引用。

最好的解决方案是直接对 String 进行就地修剪。遗憾的是目前标准库中没有。

你的第二个解决方案也可以通过一个小的改变来实现。而不是 &String 你拿一个 &str:

fn main() {
let s = "text".to_string();
let s_opt = Some(s.as_str());
let x = s_opt.map(|z| z.trim());
println!("{:?}", x);
}

关于rust - Option::map 参数的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26056210/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com