对原文做了删减,原文参考Rust中的函数式语言功能:迭代器与闭包。 目录 闭包:可以捕获环境的匿名函数 闭包会捕获其环境 闭包类型推断和注解 捕获引用或者移动所有权 将被捕获的值移出闭包和Fntrait 使用迭代器处理元素序列 Iteratortrait和next方法 消费迭代器的方法 产生其他迭代器的方法 使用捕获其环境的闭包 改进I/O项目 使用迭代器并去掉clone 直接使用返回的迭代器 使用Iteratortrait代替索引 使用迭代器适配器来使代码更简明 性能对比:循环VS迭代器 闭包和迭代器是Rust受函数式编程语言观念所启发的功能,对Rust以高性能...
本篇在原文基础上有删减和添加,增加了一些细节内容,原文请参考一个I/O项目:构建一个命令行程序。 目录 接受命令行参数 读取参数值 将参数值保存进变量 读取文件 重构改进模块性和错误处理 二进制项目的关注分离 提取参数解析器 组合配置值 使用clone的权衡取舍 创建一个Config的构造函数 修复错误处理 改善错误信息 从new中返回Result而不是调用panic! 调用Config::build并处理错误 从main提取逻辑 从run函数中返回错误 处理main中run返回的错误 将代码拆分到库crate 采用测试驱动开发完善库的功能 编写失败测试 编写使...
本文在原文基础上有删减,原文请参考 目录 如何编写测试 测试函数剖析 使用assert!宏来检查结果 使用assert_eq!和assert_ne!宏来测试相等 自定义失败信息 使用should_panic检查panic 将Result<T,E>用于测试 控制测试如何运行 并行或连续的运行测试 显示函数输出 通过指定名字来运行部分测试 运行单个测试 过滤运行多个测试 除非特别指定否则忽略某些测试 测试的组织结构 单元测试 测试模块和[cfg(test)] 测试私有函数 集成测试 tests目录 集成测试中的子模块 二进制crate的集成测试 ...
本文在原文基础上有删减,原文参考泛型、Trait和生命周期。 目录 泛型数据类型 在函数定义中使用泛型 结构体定义中的泛型 枚举定义中的泛型 方法定义中的泛型 泛型代码的性能 Trait:定义共同行为 定义trait 为类型实现trait 默认实现 trait作为参数 TraitBound语法 通过+指定多个traitbound 通过where简化traitbound 返回实现了trait的类型 使用traitbound有条件地实现方法 生命周期确保引用有效 生命周期避免了悬垂引用 借用检查器 函数中的泛型生命周期 生命周期注解语法 函数签名中的生命周期注解 深入理...
注:本文主要是方便网络不好的用户在线查看,原文请访问document-style-guide。 目录 简介 目录 License 标题 层级 原则 文本 字间距 句子 写作风格 英文处理 段落 原则 引用 数值 半角数字 千分号 货币 数值范围 变化程度的表示法 标点符号 原则 句号 逗号 顿号 分号 引号 括号 冒号 省略号 感叹号 破折号 连接号 文档体系 结构 文件名 参考链接 简介 中文技术文档的写作规范。 目录 标题 文本 段落 数值 标点符号 文档体系 参考链接 License 公共领域(publicdomain) 标题 层级 标题...
目录 用panic!处理不可恢复的错误 对应panic时的栈展开或终止 使用panic!的backtrace Windows设置RUST_BACKTRACE环境变量的两种方式 用Result处理可恢复的错误 匹配不同的错误 不同于使用match和Result<T,E> 失败时panic的简写:unwrap和expect 传播错误 传播错误的简写:?运算符 哪里可以使用?运算符 要不要panic! 示例、代码原型和测试都非常适合panic 当我们比编译器知道更多的情况 错误处理指导原则 创建自定义类型进行有效性验证 本文略有删减,原文请访问错误处理...
目录 使用Vector储存列表 新建vector Vec::new函数(无初值) vec!宏(有初值) 更新vector 读取vector的元素 注意可变和不可变引用 遍历vector中的元素 使用枚举来储存多种类型 丢弃vector时也会丢弃其所有元素 使用字符串储存UTF-8编码的文本 什么是字符串? 新建字符串 更新字符串 使用push_str和push附加字符串 使用+运算符或format!宏拼接字符串 索引字符串 内部表现 字节、标量值和字形簇 字符串slice 遍历字符串的方法 字符串并不简单 使用HashMap储存键值对 新建一个哈希map 访...
目录 包和Crate 定义模块来控制作用域与私有性 在模块中对相关代码进行分组 引用模块项目的路径 使用pub关键字暴露路径 二进制和库crate包的最佳实践 super开始的相对路径 创建公有的结构体和枚举 使用use关键字将路径引入作用域 创建惯用的use路径. 使用use引入函数 使用use引入结构体、枚举和其他项 使用use的例外用法 使用as关键字提供新的名称 使用pubuse重导出名称 使用外部包 嵌套路径来消除大量的use行 通过glob运算符将所有的公有定义引入作用域 将模块拆分成多个文件 另一种文件路径 本文在原文有删减,原文参考 使用包...
目录 结构体的定义和实例化 使用字段初始化简写语法 使用结构体更新语法从其他实例创建实例 使用没有命名字段的元组结构体来创建不同的类型 没有任何字段的类单元结构体 结构体示例程序 通过派生trait增加实用功能 方法语法 定义方法 带有更多参数的方法 关联函数 多个impl块 本文有删减,原文请参考 使用结构体组织相关联的数据。 struct或者structure是一个自定义数据类型,允许你包装和命名多个相关的值,从而形成一个有意义的组合。 结构体的定义和实例化 和元组一样,结构体的每一部分可以是不同类型。但不同于元组,结构体需要命名各部分数据以便能清楚的表明其值的...
目录 枚举的定义 枚举值 将数据直接放进每一个枚举成员 将不同类型和数量的数据放入枚举成员 有关联值的枚举和结构体的相似性 使用impl在枚举上定义方法 Option枚举和其相对于空值的优势 match控制流结构 绑定值的模式 匹配Option<T> 匹配是穷尽的 通配模式和_占位符 iflet简洁控制流 本文在原文基础上有删减,原文参考 枚举和模式匹配。 枚举的定义 结构体可以将字段和数据聚合在一起,而枚举可以将一个值成为一个集合之一。定义一个IpAddrKind枚举: enumIpAddrKind{ V4, V6, } 枚举值 创建IpAddrKi...
目录 什么是所有权? 栈(Stack)与堆(Heap) 所有权规则 变量作用域 String类型 内存与分配 变量与数据交互的方式(一):移动 变量与数据交互的方式(二):克隆 只在栈上的数据:拷贝 所有权与函数 返回值与作用域 引用与借用 可变引用 悬垂引用(DanglingReferences) 引用的规则 Slice类型 字符串slice 字符串字面值就是slice 字符串slice作为参数 其他类型的slice 本文为个人学习过程中的副产物,在原文基础上删减掉我已经掌握且个人认为不重要的内容,原文请参考 认识所有权。 所有权(系统)是Rust最为与众...
目录 变量和可变性 常量 隐藏 数据类型 标量类型 整型 浮点型 布尔型 字符类型 复合类型 元组类型 数组类型 访问数组元素 无效的数组元素访问 函数 参数 语句和表达式 具有返回值的函数 注释 控制流 if表达式 使用elseif处理多重条件 在let语句中使用if 使用循环重复执行 使用loop重复执行代码 从循环返回值 循环标签:在多个循环之间消除歧义 while条件循环 使用for遍历集合 本文大部分内容来自官方文档,对于一些基础常识的内容做了删减,适合已经掌握其它编程语言的人查阅,原文档内容参考 常见编程概念 。 变量和可变性 变量默...
目录 安装插件 创建项目 运行调试 参考文档 安装插件 直接安装Rust插件即可,里面包含了3个扩展包会自动安装: 各个插件的作用可以查看:如何使用VSCode配置Rust开发环境(VSCode安装Rust常用插件)。 创建项目 可以手动创建目录、文件,用任意编辑器写好代码,然后用命令行编译运行,参考官方文档-世界您好!。 Cargo是Rust的构建系统和包管理器,使用Cargo添加依赖项会容易得多,一般我们使用Cargo创建项目 先创建一个projects目录存放项目,目录如下: D:\VSCode\Rust\projects 先进入projects文件夹,然后在资源管理器...
目录 下载rustup-init.exe(Rust安装工具) 使用镜像加速rustup安装 安装Rust 安装标准库源码 使用镜像加速cargo包下载 安装结果确认 更新、卸载和文档查看 参考文档 下载rustup-init.exe(Rust安装工具) 下载安装程序https://www.rust-lang.org/tools/install,我选的是64位: 使用镜像加速rustup安装 按Win+X,然后按A以管理员权限启动Powershell,分别执行以下命令: [environment]::SetEnvironmentvariable("RUSTUP_DIST_SERV...
目录 指定ID 对象指针 建立对象 控件样式 消息映射 按钮单击 组合框选中 指定ID 在类中声明并定义按钮控件的起始ID,以控件的类型和功能对动态控件ID进行分组,每组最好定义一个自己的起始ID方便管理: defineIDC_CONTROL_START1000 defineIDC_BTN_STARTIDC_CONTROL_START+100 defineIDC_STA_STARTIDC_CONTROL_START+200 defineIDC_EIT_STARTIDC_CONTROL_START+300 defineIDC_CMB_STARTIDC_CONTROL_STAR...
本文是使用ChatCPT生成的,最终的代码使用起来没问题。代码是通过两轮对话完善的,后面把对话合并后跑不出理想效果就没尝试了。 第一轮对话 请求 c11实现一个线程安全的map,使用方法与std::map保持一致,实现[]运算符 回复 以下是一个简单的线程安全的map实现,可以使用[]运算符来访问和修改map中的元素: //代码省略,后面一起给出 该实现使用std::map作为底层数据结构,并使用std::mutex保证线程安全。在[]运算符中,使用std::lock_guard<std::mutex>来自动加锁和解锁。其他方法也都加了锁来保证线程安全。 示例用法: //代码省略...
目录 简介 使用示例 下载示例 main文件 设置ImGui风格 设置字体 主循环 添加Application类 中文编码问题 界面设计 关于imgui_demo.cpp 创建停靠空间 创建页面 隐藏窗口标签栏 创建导航页面 创建内容页面 隐藏控制台窗口 打包程序 总结 待解决问题 开发优势 附件 简介 ImGui是一个用于C的用户界面库,跨平台、无依赖,支持OpenGL、DirectX等多种渲染API,是一种即时UI(ImmediateModeUserInterface)库,保留模式与即时模式的区别参考保留模式与即时模式。ImGui渲染非常快,但界面上有大...
目录 使用图标字体 扩展:内存加载字体 隐藏主窗口标题栏 增加程序退出 改进HideTabBar 窗口最大化 总结 本文主要介绍ImGui应用中的一些界面优化方法,如果是第一次使用ImGui推荐从上一篇文章开始: 使用C界面框架ImGUI开发一个简单程序,最终的界面效果如下: 使用图标字体 下载IconFontCppHeaders里的IconsFontAwesome6.h文件引入到项目,然后下载fa-solid-900.ttf放到项目根目录,把系统字体目录下的msyh.ttc也移到根目录。项目文件如下: 参考IconFontCppHeaders的示例,字体加载的代码...
目录 引用源码 封装Log头文件 使用方法 spdlog是一个开源、跨平台、无依赖、只有头文件的C11日志库,网上介绍的文章有很多这里就不过多的介绍了,GitHub链接: https://github.com/gabime/spdlog。 引用源码 先下载spdlog的源码,将源码的include文件夹复制到自己的项目文件夹下: 然后在项目属性中包含include目录,如下图所示: 封装Log头文件 一般的项目对日志要求都不高,主要是要求日志线程安全、异步写入文件、每天生成新日志、支持日志回调显示,spdlog稍微配置一下即可。把spdlog相关的配置全放到Log.h文件中,封...
目录 自定义日志类 NLog版本的日志类 Serilog版本的日志类 上个月换工作,新项目又要重新搭建基础框架,把日志实现部分单独记录下来方便以后参考。 自定义日志类 代码大部分使用ChatGPT生成,人工进行了测试和优化,主要特点: 线程安全,日志异步写入文件不影响业务逻辑 支持过期文件自动清理,也可自定义清理逻辑 缓存队列有内存上限防呆,防止异常情况下内存爆满 提供默认的静态日志记录器,也支持自定义多个日志记录器 通过委托方法支持日志文件名、日志记录格式的自定义,更加自由 使用方法: //正常写入日志 LogManager.Info("Thisisaninfomessa...