rust持续学习 get_or_insert_with

通常使用一个值

if(x===null)x=some_valid_value

忽然今天看见一段代码

rust 复制代码
pub fn get_id() -> u64 
{
let mut res = struct.data.borrow_mut();
*res.get_or_insert_with(||{
 let mut xx = ...... some logic
 let id = xx.id; 
 id});
}

感觉这个名字蛮奇怪的 insert

然后翻了一下代码,是来自option.rs,原来就是空则赋值,这个写法对我来说蛮新奇的

rust 复制代码
    #[inline]
    #[stable(feature = "option_entry", since = "1.20.0")]
    #[rustc_const_unstable(feature = "const_option_ext", issue = "91930")]
    pub const fn get_or_insert_with<F>(&mut self, f: F) -> &mut T
    where
        F: ~const FnOnce() -> T,
        F: ~const Destruct,
    {
        if let None = *self {
            // the compiler isn't smart enough to know that we are not dropping a `T`
            // here and wants us to ensure `T` can be dropped at compile time.
            mem::forget(mem::replace(self, Some(f())))
        }

        // SAFETY: a `None` variant for `self` would have been replaced by a `Some`
        // variant in the code above.
        unsafe { self.as_mut().unwrap_unchecked() }
    }
相关推荐
ttwuai几秒前
Go 后台接入单点登录后,JWT、菜单权限和接口 403 怎么验?
开发语言·后端·golang
qeen871 分钟前
【C++】C++中的错误处理机制-异常
开发语言·c++·异常
步行cgn8 分钟前
OCP开闭原则:面向对象设计的核心原则
java·开发语言·开闭原则
Willliam_william8 分钟前
QEMU学习之路(13)— 在BusyBox中安装pciutils
学习
曹牧9 分钟前
C#:模态对话框
开发语言·c#
en.en..18 分钟前
Linux wait()函数(预防僵尸进程)
java·大数据·开发语言
小白的后端世界19 分钟前
数据分析基础学习
人工智能·学习·数据分析
扬大平仔32 分钟前
小深:用 AgentScope Java 2.0 Harness 做私人助手(上)
java·开发语言
人工智能培训38 分钟前
从“捏泥人”到“造世界”:3D生成式AI的技术跃迁与产业落地
大数据·人工智能·学习·生活·ai写作
yume_sibai39 分钟前
正则表达式完全指南(基础语法 + 实战应用 + 性能优化 + 最佳实践)
开发语言·正则表达式·c#