gpt4 book ai didi

rust - Ref::map 中的人体工程学选项处理

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

我有一个函数试图返回 RefRefcell .引用在 Option 后面,如果 Option,我希望能够返回引用或错误是 None .

目前,我正在事先检查是否没有,如果有则返回错误。之后,我调用unwrap()在选项里面 Ref::map以便返回对象。

有没有更符合人体工程学的方法来做到这一点?这看起来很烦人(多次借用()等)Option有一个方法 ok_or将其转换为 Result 类型。有没有办法在这里使用它?

这是一个 Rust playground重现最小的例子:

    pub fn get_thing_convenience(&self) -> Result<Ref<f32>, Box<dyn Error>> {
if self.thing.borrow().is_none() {
return Err(Box::new(MyError("blah".into())))
}
let thing = Ref::map(self.thing.borrow(), |t| t.unwrap());

Ok(thing)
}

最佳答案

曾经有一个 filter_map 方法,但它被删除了,因为该功能可以(通常?)以性能成本安全地实现,并且不清楚 filter_map 是否是最好的方法(它是特殊情况 Option ,最近关于 Try 的更改/辩论使事情变得复杂,并且有一种方法将 Ref<Option<T>> 转换为 Option<Ref<T>> 可能更有意义)。然而,与此同时,有一个箱子 ref_filter_map 正是这样做的,并且“被认为是安全的”。

你可以这样使用它:

use ref_filter_map::ref_filter_map;

pub fn get_thing_convenience(&self) -> Result<Ref<f32>, Box<dyn Error>> {
ref_filter_map(self.thing.borrow(), |t| t)
.ok_or_else(|| Box::new(MyError("blah".into())))
}

但是,如果您担心不安全,您可能需要考虑简单地以缓慢的方式进行。

关于rust - Ref::map 中的人体工程学选项处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62423711/

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