gpt4 book ai didi

rust - Option::map 的结果不够长

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

我希望下面的两个函数是等价的。但是第一个不编译。

pub fn does_not_work<I: IntoIterator>(values: I)
where
I::Item: AsRef<str>,
{
if let Some(value) = values.into_iter().nth(0).map(|item| item.as_ref()) {
if value == "first" {
println!("This should print");
}
}
}

pub fn does_work<I: IntoIterator>(values: I)
where
I::Item: AsRef<str>,
{
if let Some(value) = values.into_iter().nth(0) {
if value.as_ref() == "first" {
println!("This should print");
}
}
}

fn main() {
does_work(&["first"]);
}

编译错误为:

error[E0597]: `item` does not live long enough
--> src/main.rs:5:63
|
5 | if let Some(value) = values.into_iter().nth(0).map(|item| item.as_ref()) {
| ^^^^ - `item` dropped here while still borrowed
| |
| borrowed value does not live long enough
...
9 | }
| - borrowed value needs to live until here

代码经过更改,比它所来自的实际上下文更简洁,并且更清楚地说明了这一点。为了阐明我为什么要使用第一种方法,我在实际代码中多次使用 value 并且我不想让它们中的每一个都跟着 .as_ref( )

有没有办法让它工作或者 Option::map 对于这种情况不是一个好的选择?有没有另一种简洁的方法来解决这个问题?

最佳答案

当您创建一个新的迭代器时,旧值不再可用。但是您需要旧值存在才能返回 Some(value)。在您的情况下,您将 &[&'static str] 传递给函数,因此可以保证它保留足够长的时间,但根据类型,您也可以传递 &[字符串].

在那种情况下,原始的 String 可以被释放,你会留下一个悬垂的指针。通过不调用 .as_ref(),您保证原始值将在 Some(value) 中可用。

如果您只想跳过多个 .as_ref() 调用,您可以改为:

pub fn does_work<I: IntoIterator>(values: I)
where
I::Item: AsRef<str>,
{
if let Some(value) = values.into_iter().next() {
let s = value.as_ref();
if s == "first" {
println!("This should print");
}
}
}

关于rust - Option::map 的结果不够长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35249309/

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