gpt4 book ai didi

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

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

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

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/

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