- 博客(39)
- 收藏
- 关注
原创 10.1通用数据类型
当定义一个使用泛型的函数时,我们将泛型放在函数签名中,通常是在指定参数和返回值的数据类型的位置。这样做使我们的代码更灵活,并为调用者提供更多功能,同时避免代码重复。继续之前最大的那个函数,清单10-4展示了两个都能找到切片中最大值的函数。接下来我们会把它们合并成一个使用泛型的单一函数。文件名:src/main.rslargestlargestprintln!println!清单10-4:两个仅名称和签名中的类型不同的函数。
2025-08-02 15:37:55
1016
原创 10.泛型类型、特征和生命周期
在深入了解泛型语法之前,让我们先看看不涉及任何范性化,只是通过提取一个把具体值替换成代表多种值占位符的函数来去重的方法,然后再应用相同技巧提取出一个真正意义上的“范性”函数!函数可以接受某个泛型类型的参数,而不是像 i32 或 String 这样的具体类型,就像它们接受未知值作为参数以便对多个具体值运行相同代码一样。最后,我们讨论生命周期:一类特殊的泛型,它向编译器提供引用之间关系的信息。例如,假设我们有两个函数:一个用于查找 i32 值切片中的最大项,另一个用于查找 char 值切片中的最大项。
2025-08-02 15:23:57
694
原创 9.3panic!最佳实践
进一步利用 Rust 类型系统确保有效值,我们来看创建自定义验证类型示例。回想第2章猜数字游戏,我们从未验证用户猜测是否介于1到100之间,只确认猜测为正数。在这种情况下后果不严重:“太大”或“太小”的输出仍然正确。但若能引导用户作出合法猜测,并区分超范围数字与字母等非法输入,则更佳。一种方法是将猜测解析成 i32 而非仅 u32,以允许负数,然后添加范围检查,如下:文件名: src/main.rsloop {// --省略--println!("秘密数字必须介于1到100之间");
2025-08-02 15:19:39
675
原创 9.2可恢复错误与 Result
尽管这个 main 函数体内只会返回 std::io::Error 类型的错误,但通过指定 Box,即使以后向 main 函数体添加了返回其他错误的代码,这个签名依然是正确的。,当 File::open 和 read_to_string 都成功时,我们依然返回包含 username 的 Ok 值,而不是错误。将文件读入字符串是一个相当常见的操作,因此标准库提供了方便的 fs::read_to_string 函数,它会打开文件、创建新的 String、读取文件内容并放入该 String 中,然后返回。
2025-08-02 15:10:16
758
原创 9.1无法恢复的错误与 panic!
Rust 中的回溯与其他语言类似:阅读回溯时应从顶部开始,一直读到看到自己编写文件的位置,那就是问题起源所在的位置。在清单9-1中,我们故意写了会触发 panic 的代码,要修复它,只需避免请求超出向量范围之外的元素即可。调用可能是在被我们代码间接调用的其他库代码里,此时错误消息报告的是那个库文件及其对应行号,而非最终导致该宏被触发的我们自己的源码位置。默认情况下,当发生 panic 时,程序开始进行栈展开,也就是 Rust 会沿着调用链向上回溯,并清理每个函数中的数据。然而,回溯和清理工作量较大。
2025-08-01 20:02:41
637
原创 8-3在哈希映射中存储带关联值的键
向量、字符串和哈希映射提供程序设计中大量必要功能,用于存储、访问与修改数据。给定整数列表,用vector求其中位数(排序后处于中间位置)和众数(出现最多次数),众模式计算适合用hash map。将字符串转换成猪拉丁语(pig latin):每个词首辅音移至末尾再加"ay",如first转成irst-fay,以元音开头则直接加"hay",如apple转成apple-hay,要注意UTF-8编码细节!
2025-08-01 11:48:25
719
原创 8.2-使用字符串存储 UTF-8 编码文本
首先定义“字符串”这个术语。Rust 核心语言只有一种字符串类型,即通常以借用形式 &str 出现的字符串切片 str。在第4章,我们讲过字符串切片,它们是对存储在别处某些 UTF-8 编码数据的引用。例如,字符串字面量存储在程序二进制文件中,因此它们就是字符串切片。String 类型由 Rust 标准库提供,而非内置核心语言,是一种可增长、可变、有所有权且采用 UTF-8 编码的字符串类型。
2025-08-01 00:06:26
769
原创 8.1-使用向量存储值列表
此代码无法编译,通过错误信息指出不能同时拥有不可变借用和可变借用,因为push可能触发内存重分配,使之前持有的不变引用失效。宏,它会根据给定的值创建一个新的向量。当你有一系列项目时,比如文件中的文本行或购物车中的商品价格,向量非常有用。总结一下,本章节介绍了一些最常用且实战价值极高的方法来操作Vec,请务必查阅官方API文档以掌握更多丰富功能,比如 pop 用于移除并返回最后一项等辅助函数。像其他结构体一样,当Vector离开作用域即被丢弃(drop),其所含全部资源都会被回收,包括其中保存的数据。
2025-07-31 22:55:49
941
原创 7.5将模块分离到不同的文件中
Rust 支持将包拆分成多个 crate,以及将 crate 拆分成多个模组,从而可以跨模组选用其中定义项,可通过绝对或相对路径指定这些项。这些路径可借助 use 声明引入作用域,以便多次使用时写出更简短形式。默认情况下,模组内代码是私有;若想公开,则需添加 pub 关键字修饰。下一章,我们将继续探讨一些…
2025-07-30 19:42:21
572
原创 07.4-使用 use 关键字引入路径
在清单7-11中,我们将 crate::front_of_house::hosting 模块引入到 eat_at_restaurant 函数的作用域内,因此只需指定 hosting::add_to_waitlist 即可在 eat_at_restaurant 中调用 add_to_waitlist 函数。然后,为了将 rand 的定义引入到我们包的作用域内,我们添加了一条以 crate 名称 rand 开头的 use 语句,并列出了想要引入作用域的项。注意,use 仅为其所在的特定作用域创建快捷方式。
2025-07-27 22:12:08
825
原创 rust-模块树中引用项的路径
虽然 front_of_house 并非公有,但由于 eat_at_restaurant 与 front_of_house 定义于同一父级(即二者是兄弟关系),所以我们可以从 eat_at_restaurant 引用 front_of_house。例如,如果我们将front_of_house模块和eat_at_restaurant函数移入名为customer_experience的模块,则需要更新指向add_to_waitlist的绝对路径,但相对路径仍然有效。因为模块是容器,仅仅将模块设为公共作用不大;
2025-07-27 22:02:22
1290
原创 rust- 定义模块以控制作用域和隐私
本节中,我们将讨论模块及模块系统的其他部分,即路径(允许你为项命名);use 关键字(将路径引入作用域);以及 pub 关键字(使项公开)。我们还会讨论 as 关键字、外部包和通配符操作符。
2025-07-27 20:51:10
698
原创 rust-包和箱子
在项目目录中,有一个 Cargo.toml 文件,表示这是一个包。同样,如果包目录中包含 src/lib.rs,Cargo 知道该包包含一个与包同名的库 crate,而 src/lib.rs 是其根文件。这里,我们有一个只包含 src/main.rs 的包,这意味着它只包含一个名为 my-project 的二进制 crate。即使你运行 rustc 而不是 cargo,并传入一个源代码文件(就像我们在第1章“编写和运行 Rust 程序”中所做的那样),编译器也会将该文件视为一个箱子。
2025-07-27 19:37:02
431
原创 rust-简洁的控制流
至此,我们介绍了如何借助枚举创建可选多态类型,以及标准库提供帮助防止错误发生的 Option 类型。当枚举携带数据时,可根据需求选择使用match或if-let解构并访问这些数据,从而灵活应对各种情况。你的 Rust 程序现在能够通过结构体和枚举准确地表示领域概念,为 API 创建自定义类型确保类型安全——编译器保证每个函数只能接收预期的数据类型参数。为了向用户提供组织良好且易于使用,只暴露必要内容的软件接口,让我们接下来转向学习 Rust 模块系统吧。
2025-07-26 00:52:43
877
1
原创 rust-匹配控制流结构
Rust 有一个非常强大的控制流结构,称为 match,它允许你将一个值与一系列模式进行比较,然后根据匹配的模式执行相应的代码。第19章涵盖了所有不同类型的模式及其作用。不同的是,这里不是比较硬币,而是比较 Option<T> 的变体,但 match 表达式的工作方式保持不变。同样地,值会依次经过 match 中的每个模式,在第一个“适合”的模式处,该值就进入对应代码块并用于执行。我们可以写一个函数,接收未知种类的美国硬币,并像计数机器一样确定是哪种硬币,然后返回其面值(以美分为单位),如清单6-3所示。
2025-07-26 00:38:24
883
原创 rust-枚举
结构体(struct)为你提供了一种将相关字段和数据组合在一起的方法,比如一个包含宽度和高度的矩形,而枚举(enum)则让你能够表示某个值是可能取自一组值中的一种。例如,我们可能想说矩形是可能的几何图形之一,其他还包括圆形和三角形。为此,Rust 允许我们用枚举来编码这些可能性。让我们来看一个代码中可能需要表达的场景,并看看为什么在这种情况下枚举比结构体更有用且更合适。假设我们需要处理 IP 地址。目前,有两个主要标准用于 IP 地址:版本四(IPv4)和版本六(IPv6)。
2025-07-24 21:43:36
1011
原创 rust-方法语法
让我们将接收 Rectangle 实例作为参数的 area 函数改为定义在 Rectangle 结构体上的 area 方法,如清单5-13所示。文件名: src/main.rswidth: 30,println!清单5-13:在Rectangle结构体上定义area方法为了在Rectangle上下文中定义函数,我们开始了一个针对Rectangle的 impl(实现)块。这个 impl 块中的所有内容都与类型 Rectangle 相关联。
2025-07-24 21:17:43
848
原创 rust-结构体使用示例
area 函数访问 Rectangle 实例中的 width 和 height 字段(注意,对借用 struct 实例字段进行访问不会移动字段值,因此经常看到对 struct 的借用)。这表明宽高彼此关联,并且比起直接按索引访问 tuple 元素(如 .0、.1),这种方式提供了描述性的名称,有助于提升代码可读性,这是一次胜利。虽然不是最漂亮的输出,但它显示了实例所有字段的值,这在调试时非常有帮助。但另一方面,这个版本不够直观,因为元组元素没有名字,我们必须通过索引访问各部分,使得计算过程不那么明显。
2025-07-24 21:02:42
793
原创 rust-数据结构
结构体类似于“元组类型”一节中讨论的元组,因为两者都包含多个相关的值。像元组一样,结构体中的各个部分可以是不同的类型。但与元组不同的是,在结构体中你需要为每个数据部分命名,以便明确这些值的含义。添加这些名称使得结构体比元组更灵活:你不必依赖数据的顺序来指定或访问实例中的值。要定义一个结构体,我们输入关键字 struct 并为整个结构体命名。结构体的名称应描述被组合在一起的数据部分的重要性。然后,在花括号内定义数据部分(称为字段)的名称和类型。例如,清单 5-1 展示了一个存储用户账户信息的结构体。
2025-07-24 20:15:55
807
原创 rust-切片类型
所有权、借用以及 Slice 概念共同保证 Rust 程序内存安全并发生于编译期控制之下。Rust 提供系统级语言般精细内存管理能力,但拥有者离开作用域时自动释放资源,无需手动写复杂销毁代码,从而减少调试负担。所有权机制贯穿 Rust 多处设计理念,全书后续章节将持续深入探讨。本章至此结束,我们接下来进入第五章学习如何通过结构体(struct)组合数据块吧!
2025-07-24 17:10:06
1098
原创 rust-参考与借用
与指针不同的是,引用在引用的生命周期内保证指向一个特定类型的有效值。然而,允许多个不可变引用是合理的,因为那些只是读取数据的人无法影响其他人的读取。注意,引用的作用域从它被引入的地方开始,并持续到最后一次使用该引用的地方。我们可以通过一些小的调整来修复清单4-6中的代码,从而允许我们修改一个被借用的值。可变引用有一个重要的限制:如果你有一个对某个值的可变引用,那么你不能有其他对该值的引用。因为引用并不拥有它,所以当引用不再被使用时,它所指向的值不会被释放。正如变量默认是不可变的一样,引用也是不可变的。
2025-07-24 16:43:34
757
原创 rust-所有权
什么是所有权所有权是一组规则,它决定了 Rust 程序如何管理内存。所有运行中的程序都必须管理它们对计算机内存的使用方式。某些语言使用垃圾回收(GC),在程序运行时定期查找不再使用的内存;另一些语言则要求程序员显式地分配和释放内存。Rust 采用第三种方式:通过一套编译期检查的“所有权系统”来管理内存。一旦违反这些规则,程序就无法通过编译。所有权机制的任何特性都不会在运行时拖慢程序。对许多开发者来说,所有权是一个全新概念,确实需要一定时间适应。
2025-07-24 15:14:38
719
原创 rust流程控制
本章内容不少:你学习了变量、标量和复合数据类型、函数、注释、if表达式和循环!实现华氏度与摄氏度的相互转换。生成第 n 个斐波那契数。利用歌曲中的重复结构打印圣诞颂歌《圣诞十二日》的歌词。准备好后,我们将讨论 Rust 中其他语言不常见的概念:所有权。
2025-07-24 12:01:42
912
原创 linux Ubuntu 安装postgrsql
确保防火墙没有阻止从外部 IP 地址到 PostgreSQL 服务器的连接。要允许所有 IP 地址访问 PostgreSQL 服务器,你可以在。编辑 PostgreSQL 环境配置文件。来表示所有 IPv4 地址,或者使用。编辑 PostgreSQL 配置文件。确保 PostgreSQL 配置文件。或其他防火墙工具来检查和配置防火墙。来表示所有 IPv6 地址。如果显示的新数据目录路径为。文件中添加一行配置,使用。假设你要将数据目录移动到。,以监听所有 IP 地址。
2024-09-07 21:20:56
1399
原创 7B模型中型企业部署硬件配置详解
在上述中等配置下,通过合理的优化和负载管理,一个系统能够支撑大约2400-4800左右的用户数。这一估算值基于某些理想假设,如每个用户每分钟发起一个请求。实际支持的用户数可能会因为用户行为、请求模式、系统优化等因素有所不同。通过实际的负载测试和运行数据分析,进一步调整系统配置和优化方案,可以更精准地估算支持的用户数并提升系统性能。
2024-05-24 14:55:25
4241
原创 docker部署mysql5.7
命令行工具、MySQL Workbench 或其他数据库管理工具)连接到你的 MySQL 数据库。为了确保 MySQL 数据在容器重启或删除后不会丢失,你可以将数据目录挂载到主机目录。这样,你就成功地使用 Docker 部署了 MySQL 5.7,并使其能够被外部用户访问。例如,如果你使用的是。你可以通过 MySQL 客户端连接到数据库并创建新的数据库和用户。:将容器的 3306 端口映射到主机的 3306 端口。:设置 MySQL root 用户的密码。密码:你在步骤 3 中设置的密码(例如。
2024-05-23 14:06:36
899
原创 查看在 CentOS 系统上哪些客户端连接了特定的端口
要查看在 CentOS 系统上哪些客户端连接了特定的端口(例如9030端口),你可以使用netstat或ss命令。ss命令是一个更现代的工具,用于显示套接字统计信息,它可以替代netstat命令。
2024-03-08 10:11:21
961
原创 docker 命令记录
回收 Docker 使用的空间主要是通过删除不再需要的镜像、容器、卷和网络。但要谨慎进行,避免删去当前还在使用或未来可能再次需要的资源。
2024-03-06 10:24:16
464
原创 在 Linux 查看操作系统信息
目录下所有以 “release” 结尾的文件的内容,你可以获得关于系统发行版的信息。这个命令对于绝大多数 Linux 发行版都适用,包括 Ubuntu 和 CentOS。在 Linux 系统中,你可以通过多种方法来检查你的系统是 Ubuntu 还是 CentOS。通过这些方法,你可以轻松地判断出自己的 Linux 系统是Ubuntu还是CentOS。命令的实现,但在某些版本中可能通过安装相关包来支持这一命令。命令也提供了操作系统的信息,包括发行版名称和版本。文件的内容可以帮助你获取当前系统的详细信息。
2024-02-22 15:05:59
2514
原创 docker chrome 镜像制作
docker commit -m ‘镜像描述’ -a ‘制作者’ 容器名 镜像名。复制字体到 /usr/share/fonts/
2023-03-20 09:56:31
789
1
原创 servicecomb rpc 调用超时问题
servicecomb rpc 调用超时问题错误日志如下:org.apache.servicecomb.swagger.invocation.exception.InvocationException: InvocationException: code=490;msg=CommonExceptionData [message=Unexpected consumer error, please check logs for details]60cac2cafff29e45e1f86e0b at or
2021-06-17 14:00:38
1934
原创 centos 6.5安装nodejs(v12.18.1)全网最细
一.准备工作(1)查看GLIBCXX版本,node需要 GLIBCXX_3.4.18版本以上,如果版本过低需要升级libstdc++.so.6.0.26 否则直接跳过 这一步strings /usr/lib64/libstdc++.so.6 | grep GLIBC1.下载libstdc++.so.6.0.26 2.解压并且把解压的文件复制到 /usr/lib64/目录下 cp libstdc++.so.6.0.26 /usr/lib64/ 3. 进入到/usr/lib64/ 目
2020-07-24 00:05:43
1424
1
原创 看到类似的javapdf吗
pom文件如下com.itextpdf.toolxmlworker5.5.8org.freemarkerfreemarker2.3.28java 代码如下import com.itextpdf.text.Document;import com.itextpdf.text.pdf.PdfWriter;import com.itextpdf.tool.xml.XMLWo...
2018-11-06 11:33:57
204
原创 hashmap的基本模型理解
1.hashMap的默认长度为16. Put操作 首先计算key的hash值,key为空时hash为0, 如果是第一个值则创建一个Node的数组对象,数组的长度为16 因为数组的长度为16,所以数组下标的取值为(0~15),0=< (hash值除以15取余)<=15 那么第一个Node对象下标就是 key的hash值除以15取余。 2。装载因子的默认值为0.75 装载因子...
2018-08-14 21:54:24
570
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅