我原本以为下面这两个函数是等价的,但第一个函数无法编译。
编译错误是:
代码已经修改,比实际情况更加简洁明了,以更清楚地说明重点。为了澄清为什么我想使用第一种方法,我的实际代码中使用了很多次
有没有办法使它能够运作,或者
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
不是这种情况的好选择?是否有其他简洁的方法来解决这个问题?
.as_ref()
是安全的,而在if let中调用则不安全。 - skylerdoes_not_work
示例中,map
之后item
不再存在,因此无法返回其先前值的任何指针。 在您的第二个示例和我的答案中,value
和item
是相同的。s
只是转换后的value
- 它们都存在于同一个块中(直到if
结束)。 - viraptor