rust 编程开发
文章平均质量分 77
rust 语言
i-neojos
古之成大事者,不惟有超世之才,亦必有坚忍不拔之志
展开
-
rust入门基础案例:猜数字游戏
案例出处是《Rust权威指南》,书中有更加详细的解释。原创 2023-11-05 00:08:22 · 729 阅读 · 0 评论 -
rust小白入门
文档,按照 rust 编译环境非常简单,macos 执行下面的语句,安装成功 rustup 工具,开发环境也就搭建好了。执行成功之后,记得执行 source 命令让 rustup 生效。原创 2023-06-15 08:02:06 · 1196 阅读 · 0 评论 -
动态加载库
为了让其它语言正常地识别。原创 2023-12-16 10:44:00 · 503 阅读 · 0 评论 -
外部函数接口FFI
是编程语言定义函数的一种方式,它允许其它编程语言来调用这些函数。代码可能需要与另外一种语言编写的代码进行交互。关键字来简化创建和使用外部函数接口(原创 2023-12-14 00:17:46 · 1221 阅读 · 0 评论 -
不安全的裸指针
实际上,将不安全的代码封装在安全的函数中是一种十分常见的抽象。但在使用裸指针时,我们却可以创建指向同一地址的可变指针和不可变指针,并通过可变指针来改变数据。由于这两个裸指针来自有效的引用,所以我们能够确认它的有效性。方法也是不安全的,因为它必须默认地址的偏移量也是一个有效的指针。借用一个切片的不同部分从原理上来讲是没有问题的,因为两个切片没有交叉的地方,但。与引用类似,裸指针要么是可变的,要么是不可变的,它们分别被写作。默认接收的裸指针参数是合法的,所以它是不安全的。的可变引用和不可变引用,那个就会因为。原创 2023-12-14 00:15:54 · 260 阅读 · 0 评论 -
模式|表达式匹配
if let。原创 2023-12-14 00:13:36 · 115 阅读 · 0 评论 -
字符串String
字符串字面量变量s属于字符串字面量,它们属于硬编码进程序的字符串值,属于不可变的类型。但并不是所有字符串的值都能够在编写代码时确定。原创 2023-12-10 21:50:33 · 256 阅读 · 0 评论 -
RUST博客帖子编辑示例
是一种面向对象的设计,它的关键点在于:一个值拥有的内部状态由数个状态对象()表的而成,而值的行为则随着内部状态的改变而改变。这个语法意味着该方法只能被包裹着当前实例的。不允许结构体中出现未被填充的值。方法需要获取状态值的所有权。无法在我们完成状态转换后再次使用旧的。的所有权并使旧的状态失效,从而将。定义了文章状态共享的行为,状态。声明中,第一个参数的类型是。调用,它会在调用过程中获取。值,并在原来的位置留下一个。值的所有权,而不能直接使用。状态转换为一个新的状态。这种代码,这可以确保。原创 2023-12-09 20:23:16 · 479 阅读 · 0 评论 -
rust 包模块组织结构
有几条规则决定了包可以包含哪些东西:首先,一个包中最多只能拥有一个库单元包。其次,包可以拥有多个二进制单元包。最后,包内必须存在至少一个单元包(库单元包或二进制单元包)。提供了一系列的功能来帮助我们管理代码,包括决定哪些细节是暴露的、哪些细节是私有的,以及不同的作用域的命名管理。)可以拥有多个二进制单元包及一个可选的库单元包。随着包内代码规模的增长,你还可以将代码拆分到独立的单元包(视作一个二进制单元包的根节点,这个二进制单元包与包拥有相同的名字。也会自动将其视作与包同名的库单元包的根节点。原创 2023-12-05 08:03:35 · 467 阅读 · 0 评论 -
enum 枚举类型
我们可以通过定义枚举IpAddrKind来表达这样的概念,声明该枚举需要列举出所有可能的IP地址种类,也就是所谓的枚举变体(variant枚举的变体全部位于其标识符的命名空间中,并使用两个冒号来将标识符和变体分隔开。由于和拥有相同的类型IpAddrKind,所以我们可以定义一个接收IpAddrKind类型参数的函数来统一处理它们。现在的定义只知道枚举的种类,却没有办法去存储实际的IP地址数据,只能起到一个标识的作用。但实际上,枚举允许我们在变体上嵌套数据。在新的IpAddr枚举变体中,V4和V6。原创 2023-12-05 08:02:20 · 119 阅读 · 0 评论 -
dyn 动态类型
约束的泛型参数来定义结构体,但两者的工作机制截然不同。泛型参数一次只能替代为一个具体的类型,而。约束就再好不过了,因为这段定义会在编译时被多态化以便使用具体的类型。对象则允许你在运行时填入多种不同的具体类型。通过在定义动态数组时指定。方法只关心值对行为的响应,而不在意。这个动态数组元素类型使用了新语法。对象,它被用来代表所有被放置在。如果你需要的仅仅是同质集合(实例只会接收那些能够调用。我们同样可以使用带有。原创 2023-12-05 08:00:28 · 139 阅读 · 0 评论 -
RefCell 数据类型
假如我们能够保证自己的代码在运行时符合借用规则,那么即使编译器无法在编译阶段保证符合借用规则,也能使用那些采用了内部可变性模式的类型。的设计模式之一,它允许你在只持有不可变引用的前提下对数据进行修改。为了能改变数据,内部可变性模式在它的数据结构中使用了。只能被用于单线程场景中。强行将它用于多线程环境中会产生编译时错误。则只会在运行时检查这些规则,并在违反借用规则的情况下触发。会在编译阶段强制代码遵守借用规则。正常的可变性和借用规则。(不安全)代码来绕过。原创 2023-12-03 20:04:14 · 473 阅读 · 0 评论 -
引用计数 Rc 数据类型
RUST提供了一个名为Rc的类型来支持多重所有权,Rc是的缩写。Rc类型实例会在内部维护一个用于记录值引用次数的计数器,从而确定这个值是否仍在使用。如果一个值的引用次数为零,就意味着这个值可以被安全清理掉,而不会触发引用失效的问题。你可以把Rc想象成客厅的电视,在第一个人打开电视之后,后续进入客厅的其他人都可以直接观看电视。电视会一直保持开启状态直到最后一个人离开时关闭,因为此时不需要再使用电视了。原创 2023-12-03 14:40:46 · 137 阅读 · 0 评论 -
装箱 Box 数据类型
RUST必须在编译时知道每一种类型占据的空间大小,但有一种递归的类型却无法在编译时被确定具体大小。Nil,我们尝试使用枚举来表达一个持有i32值的链表数据类型,通过不断嵌套元组的形式最终组成一个列表。但程序无法编译通过,RUST认为这个类型拥有无限大小,无法确认类型所占用的存储空间大小。Quit,RUST如何计算Message类型的大小?为了计算Message值需要多大的存储空间,RUST会遍历枚举中的每一个成员来找到需要最大空间的那个变体。不需要占用任何空间,需要两个存储i32。原创 2023-12-03 00:26:08 · 446 阅读 · 0 评论 -
trait 特征
将特定方法签名组合起来,用来实现某种目的所必须的行为集合。可以包含多个方法:每个方法签名占据单独一行并以分号结尾。约束用来将泛型参数指定为实现了某些特征行为的类型。用来以一种抽象的方式来定义共享行为,还可以使用。的类型都需要为上述方法提供自定义行为。原创 2023-12-01 00:04:17 · 140 阅读 · 0 评论 -
生命周期标注
结构体的字段也可以声明引用类型,不过需要为结构体定义中的每一个引用都添加生命周期标注。println!self.part如同泛型数据类型一样,为了在结构体定义中使用生命周期参数,我们需要在结构体名称后的尖括号内声明泛型周期参数的名字。这个标注意味这实例的存活时间不能超过存储在part中的引用的存活时间。结构体字段中的生命周期名字总是需要被声明在impl关键字之后,并被用于结构体名称之后,因为这些生命周期属于结构体类型的一部分。原创 2023-12-01 00:01:49 · 371 阅读 · 0 评论 -
泛型数据类型
在预导入模块找那个,所以我们不需要手动将其引入作用域。的泛型也有这样的类型约束。中间的加号(+)表示。也限制了切片的元素类型都是可比较的。的所有权,要保证这个操作顺利实现,就需要引入。当然,不是所有的类型都实现了。中想要通过大于(>)运算符来比较两个。就因为同时实现了这两个约束。原创 2023-11-28 23:55:39 · 98 阅读 · 0 评论 -
迭代器模式
自定义Counter结构体类型,并实现迭代器。其他语言的场景,读取数据库行数据时,使用的就是迭代器。我们使用for语言遍历数组,也是一种迭代。结构体对象实现Iteratortrait,创建自定义的迭代器,只需要实现一个next方法的定义。它会在每次调用时返回一个包裹在Some中的迭代器元素,并在迭代器结束时返回None。Item定义为关联类型,就像是给类型起了一个别名。这个迭代器并没有特别的地方,某种意义上它就是实现了一个接口,外部可以将这个对象当做接口来看待,最终体现在无脑适用迭代器提供的模式方法。原创 2023-11-25 16:02:45 · 545 阅读 · 0 评论 -
结构体 struct
rust结构体打印原创 2023-11-22 23:20:47 · 185 阅读 · 0 评论 -
for 循环变量的声明方式
在RUST中for循环中,变量的声明方式原创 2023-11-22 23:17:13 · 509 阅读 · 0 评论 -
rust 基础数据类型
整数的类型声明有别于其他语言,有符号整数类型名称以 u 开头,无符号以 i 开头。usize 和 isize 是两种特殊的整数类型,它们的长度取决于系统是 32位还是64位。但也有一些例外情况,比如,字符串类型的转换中变量 x 的类型,rust 就自动推导不出来。这种情况就需要显示的声明变量的类型。大部分情况下,rust 可以基于上下文自动推导出变量的类型。下面代码中,变量 x 没有显式,rust 默认是 i32 类型。对于位数为 n 的有符号整形,它可以存储。范围内的所有整数,无符号可以存储 0 到。原创 2023-11-05 16:13:02 · 559 阅读 · 1 评论 -
channel 转移数据
文章完全参考的内容,并没有进行直接翻译,而是使用另一个 redis 库来验证学习文章的例子。在了解 channel 的同时也掌握一些 redis 的编程。首先,我们需要在本机安装一个 redis 实例。原创 2023-09-20 00:28:12 · 322 阅读 · 0 评论 -
async/await 编程理解
博客主要是参考,会结合简单的例子,对 async 和 await 做比较系统的理解,如何使用 async 和 await 是本节的重点。async 和 await 主要用来写异步代码,async 声明的代码块实现了 Future 特性,如果实现 Future 的代码发生阻塞,会让出当前线程的控制权,允许线程去执行别的 Future 代码。我把 async 代码块使用 Future 来表示,关键是理解 future 和执行线程之间的关系。原创 2023-08-20 08:07:32 · 1065 阅读 · 0 评论 -
如何使用 reqwest 包
我拼凑了下面代码,虽然耗费了很大的气力,但运行不起来,仔细观察运行提示,过程中发生 panic。向连接发起一个 GET 请求:https://hacker-news.firebaseio.com/v0/topstories.json,并解析返回的内容。这段代码使用到了 reqwest、Arc、futures、serde_json,暂时不考虑代码使用的合理性。因为是 GET 请求,可以先在浏览器中进行查看,浏览器可以正常显示一个 id 列表,如下所示。我们开始 coding。原创 2023-08-06 20:44:56 · 510 阅读 · 0 评论 -
rust gtk 桌面应用 demo
精通Rust》里介绍了 GTK+框架的开发,这篇博客记录并扩展一下。rust 可以用于桌面应用开发,我还挺惊讶的,大学的时候也有学习过 VC++,对桌面编程一直都很感兴趣,而且一直有一种妄念,总觉得自己能开发一款很好用的桌面程序,就和总觉得自己能彩票中大奖一样。原创 2023-07-23 17:08:05 · 3345 阅读 · 0 评论 -
rust 并发
go 语言面试中,经常会被问到 go 语言的优势,go 的高并发能力便是优势之一。那么,rust 的并发如何呢?我们先从如何使用并发谈起,接下来会列举几个例子来说明 rust 并发编程。原创 2023-07-30 23:09:54 · 591 阅读 · 0 评论 -
rust 代码结构包和模块
rust 的头文件声明中经常会出现 extern、crate、use、mod 这些关键字,它们被用来给当前代码声明依赖。线上开发中,我们不会将所有的代码都写在 main.rs 的文件中,我们总是会组织代码结构。比如参考 MVC,会有 controller、service、model 等等目结构。我们还需要依赖各种各样的第三方库,比如 json 序列化和反序列化、发送 http 请求、gui界面等等。这些代码的结构组织和模块依赖,都需要依赖 extern、crate、use、mod 的声明。原创 2023-07-30 21:54:07 · 436 阅读 · 0 评论 -
rust 闭包函数
函数有自己的类型,可以像使用基础类型一样使用函数,包括将函数保存在变量中、保存在 vec 中、声明在结构体成员字段中。闭包函数也是函数,也有自己的类型定义。不过,函数实际上是指针类型,在 rust 所有权中属于借用的关系。我们声明一个 Vec 对象集,并使用闭包函数做排序。接下来我们自定义一个 City 结构体类型,Vec 中的每个元素都是 City 类型,后面会根据结构体中的 population 属性做排序。我们初始化 cities 变量,并向其中依次追加 3 个元素。原创 2023-07-29 22:00:17 · 881 阅读 · 0 评论 -
利用 trait 实现多态
但下面的代码会编译报错,提示 method not found,buf 实现了 Write trait,但编译器找不到这个 write_all 方法。问题的原因:特型本身必须在作用域中,否则,特型的所有方法都是隐藏的。我理解,这属于 rust 类型和 trait 的自动绑定过程。我在书上看到基于 std::io::Write 的示例,它是一个 trait 类型,内部声明了一些方法。下面的例子中调用 write_all 方式来演示,write_all 也是 Write trait 声明要实现的方法之一。原创 2023-07-25 08:00:53 · 405 阅读 · 0 评论 -
rust 的所有权
假设是 go 语言来实现同样的代码,程序没有任何问题,s1 和 s2 实际指向的同样的字符串,可以正常打印 s1,赋值前后压根不会对 s1 产生影响。快速解决上述问题的方案,是将赋值的方式修改为引用赋值,就像下面这样,给 s2 赋值的是 s1 的引用,这样 s2 就不能接管 neojos 字符串的所有权,引用赋值过程就属于。比如下面的例子,s2 指向了 s1 的可修改引用,s3 试图通过从 s2 取值,那么,s1 变量所拥有的值会发生转移吗?由 s1 转移给了 s2,然后 s1 变成了未初始化的状态。原创 2023-07-17 07:31:15 · 867 阅读 · 0 评论 -
rust 从转移说起
Rust 中,对大多数类型而言,给变量赋值、给函数传值或者从函数返回值,这些操作不会发生值复制,而是“转移”。所谓转移,就是原来的所有者让渡这个值的所有权给目标所有者,并变成未初始化状态。然后,由目标所有者控制这个值的生命期。Rust 专门提出了所有权和转移的概念,第一次接触总感觉晦涩,不属于正常思维,但还是得耐下性子,观摩观摩 Rust 所谓的转移。上面这段话是我抄的,绕来绕去的,原创 2023-07-05 00:04:39 · 546 阅读 · 0 评论 -
从 Option 类型说起
Option 不是结构体声明,而是枚举类型。印象中的枚举类型都是固定的常量,这里 Rust 的枚举支持了泛型。枚举了两种可能:有值、或没值。None表示没有值,Some(T) 表示存在 T 类型的值。原创 2023-07-01 11:59:50 · 641 阅读 · 1 评论