rust - 我如何告诉 Rust 我的 Option 的值实际上比传递给 and_then 的闭包还长?

标签 rust

这是我发现自己遇到的一个常见模式:

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 可能活得不够长,但在这种特殊情况下,vecmaybe_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/

相关文章:

generics - 使用 Diesel 的通用函数会导致溢出

vector - 如何创建 Vec<Struct> 并将其附加到 Vec<Struct>?

rust - 具有关联类型的别名特征

rust - 通用特征实现的“继承”

rust - 如何在不使用 Copy 或 Clone 的情况下克隆 Rust 中的结构?

python - 在包含来自不同 crate 的类型的使用rust 结构上使用pyo3 pyclass

rust - 如何指定自定义 Cargo 输出目录?

rust - 使用 FFI 时如何创建 "C Blocks"?

import - 如何从 Rust 中的模块导入单个函数?

rust - 使用强制转换的可变访问器是否安全?