这是我发现自己遇到的一个常见模式:
let maybe_vec = Some(vec!["val"]); // I have an option with something in it
maybe_vec.and_then(|vec| vec.get(0)); // then I want to transform the something
这给了我
src/lib.rs:317:34: 317:37 error: `vec` does not live long enough
src/lib.rs:317 maybe_vec.and_then(|vec| vec.get(0));
^~~
src/lib.rs:317:9: 317:45 note: reference must be valid for the method call at 317:8...
src/lib.rs:317 maybe_vec.and_then(|vec| vec.get(0));
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/lib.rs:317:34: 317:44 note: ...but borrowed value is only valid for the block at 317:33
src/lib.rs:317 maybe_vec.and_then(|vec| vec.get(0));
^~~~~~~~~~
对我来说,这个错误似乎过于迂腐 - vec
可能活得不够长,但在这种特殊情况下,vec
是 maybe_vec
中的东西,这显然会活得足够长。我需要在这里提供某种生命周期注释,还是我只是在做错事?
最佳答案
不幸的是,这里的编译器是正确的。 and_then
消耗 选项和选项内的值。该值被提供给闭包。您可以通过使用将变量分配给单元类型 (()
) 的技巧来看到这一点:
let a = Some(vec![1]);
a.and_then(|z| { let () = z; });
// error: expected `collections::vec::Vec<_>`,
当您调用 get
时,它会返回对切片中某个项目的引用,但 Vec
现在只存在于闭包中。一旦关闭退出,它就消失了!相反,您可以将 Option 更改为引用,然后以这种方式获取值。这将原始的 Vec
留在原处:
let a = Some(vec![1]);
a.as_ref().and_then(|z| z.get(0));
关于rust - 我如何告诉 Rust 我的 Option 的值实际上比传递给 and_then 的闭包还长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28596548/