
Rust编程与项目实战
文章平均质量分 90
《Rust编程与项目实战》
夏天又到了
微信号 magicHawaii
展开
-
微软Win11内核迎新变,Rust语言助力提升系统安全可靠性
微软在日志中强调,Rust相较于传统的C/C++编程语言,在可靠性和安全性方面具有显著优势。这意味着,随着时间的推移,Windows操作系统的内核中将有更多模块采用Rust进行开发。具体而言,微软已经通过Rust实现了一个名为win32kbase_rs.sys的内核模块,模块名称中的“rs”正是Rust的缩写。通过采用Rust对内核进行重构,微软旨在降低系统崩溃的风险,并提升Windows操作系统的整体可靠性。这一举措不仅体现了微软对技术创新的持续追求,也展示了其对用户安全性的高度重视。原创 2024-12-27 12:04:29 · 617 阅读 · 0 评论 -
Rust编程与项目实战-箱
对于Rust而言,箱(crate)是一个独立的可编译单元,它编译后会生成一个可执行文件或者一个库。笔者一般不喜欢对专有名词进行翻译,如果硬要翻译,可称之为(分隔)箱。一个箱会将相关联的功能打包在一起,使得该功能方便在多个项目中分享。例如,标准库中没有提供但是在第三方库中提供的rand箱,它提供了随机数生成的功能,我们只需要将该包通过use rand;引入当前项目的作用域中,就可以在项目中使用rand的功能:rand::XXX。同一个箱中不能有同名的类型,但是在不同箱中就可以。原创 2024-12-27 10:20:59 · 1236 阅读 · 0 评论 -
Rust编程与项目实战-模块std::thread(之二)
但是,程序通常需要特定的支持才能利用超过64个逻辑CPU,并且在没有此类支持的情况下,此函数返回的数字准确地反映了程序默认可以使用的逻辑CPU的数量。move闭包通常和thread::spawn函数一起使用,它允许用户使用其他线程的数据,这样在创建新线程时,可以把其他线程中的变量的所有权从一个线程转移到另一个线程,然后就可以使用该变量了。但如果子线程执行的代码比较长,我们通过会另外写一个函数来封装这些代码,这样在thread::spawn中只需写一个函数调用即可,这个在新线程中执行的函数通常称为线程函数。原创 2024-11-25 09:10:14 · 752 阅读 · 0 评论 -
Rust编程与项目实战-模块std::thread(之一)
但要注意的是,当主线程结束的时候,整个进程就结束了,此时派生线程也会结束,所以派生线程中的打印信息是不会全部输出完毕的。下面是一个简单的实例。事实上,如果线程及其返回值可以比它们的调用程序更持久,我们需要确保它们在之后是有效的,因为我们不知道它们什么时候会返回,所以需要让它们尽可能长时间地有效,也就是说,直到程序结束,因此是“静态生存期”。调用handle的join方法会阻止当前运行线程的执行,直到handle所表示的这些线程终结join方法返回一个线程结果值,如果线程崩溃,则返回错误码,否则返回Ok。原创 2024-11-22 08:52:52 · 1132 阅读 · 0 评论 -
Rust编程与项目实战-函数指针
如果在程序中定义了一个函数,那么在编译时,编译系统会为函数代码分配一段存储空间,这段存储空间的起始地址(又称入口地址)称为这个函数的指针。可以定义一个指向函数的指针变量,用来存放某一函数的起始地址,这就意味着此指针变量指向该函数。pfunc就是一个指向函数的指针变量,且这个函数有一个i32类型的参数,并且返回值的类型也是i32。关键字fn表示函数的意思,这里相当于指代某个函数名。9.3.2。原创 2024-11-13 17:55:30 · 1049 阅读 · 0 评论 -
Rust编程与项目实战-特质(Trait)
特质(Trait)是Rust中的概念,类似于其他语言中的接口(Interface)。trait定义了一个可以被共享的行为,只要实现了trait,就能使用该行为。如果不同的类型具有相同的行为,就可以定义一个trait,然后为这些类型实现该trait。定义trait是把一些方法组合在一起,目的是定义一个实现某些目标所必需的行为的集合。例如,现在有圆形和长方形两个结构体,它们都可以拥有周长和面积。因此,我们可以定义被共享的行为,只要实现了trait就可以使用。原创 2024-11-12 09:36:15 · 951 阅读 · 0 评论 -
【免费送书活动】《Rust编程与项目实战》
这本书已经公开发行。读者只要根据上面链接内容,在本帖评论区写一下本书的作者是谁,博主将按评论时间先后,送出3本书,送满为止。为了提高朋友们对优快云博客的认同感,本博主免费赠送读者3本书,书名为《Rust编程与项目实战》。原创 2024-11-11 10:00:30 · 222 阅读 · 9 评论 -
Rust编程与项目实战-枚举类型
在Rust中,使用关键字enum定义枚举类型。variant1,variant2,variant3,...enum_name是枚举类型的名称,大括号里面的项用逗号隔开,通常称为变体(Variant),即枚举类型的成员称为变体。比如,通过 enum 定义一个名为 IpAddrKind 的枚举,其包含所有可能的 IP 地址种类:V4 和 V6。V4,V6,Europe,Asia,Africa,America,Oceania,其中,关键字enum的意思是准备定义一个枚举类型;原创 2024-11-11 09:56:33 · 1113 阅读 · 0 评论 -
Rust编程与项目实战-结构体
Rust 中的结构体与元组都可以将若干类型不一定相同的数据捆绑在一起形成整体,但结构体的每个成员和其本身都有一个名字,这样访问它的成员的时候就不用记住下标了。元组常用于非定义的多值传递,而结构体用于规范常用的数据结构。结构体的每个成员叫作“字段”。在Rust中,我们可以使用struct关键字定义一个结构体。结构体允许我们定义多个字段(Fields),每个字段都有自己的类型和名称。通过将字段组合在一起,可以创建自己的数据类型,以便更好地表示和操作数据。原创 2024-11-08 10:42:50 · 1044 阅读 · 0 评论 -
Rust编程与项目实战-元组
元组是Rust的内置复合数据类型。Rust支持元组,而且元组是一个复合类型。我们知道,标量类型只能存储一种类型的数据。例如一个i32类型的变量只能存储一个数字。复合类型可以存储多个不同类型的数据。复合类型就像我们的菜篮子,里面可以放各种类型的菜。元组可以将其他不同类型的多个值组合到一个复合类型中。元组还拥有一个固定的长度:无法在声明结束后增加或减少其中的元素数量。通常使用逗号分隔后放置到一对圆括号中创建一个元组。元组每个位置的值都有一个类型,这些类型不需要相同。原创 2024-10-28 16:37:48 · 568 阅读 · 0 评论 -
Rust编程的泛型
C/C++、Rust都是强类型语言,在对数据进行处理时,必须明确数据的数据类型。但是很多时候,比如链表这种数据结构,可以是整型数据的链表,也可以是其他类型,可能会写出重复的代码,只是数据类型不同而已。泛型编程是一种编程风格,其中的算法以尽可能抽象的方式编写,而不依赖于将在其上执行这些算法的数据形式。泛型这个词并不是通用的,在不同的语言实现中,具有不同的命名。原创 2024-10-11 12:55:28 · 1073 阅读 · 0 评论 -
Rust编程的函数
然后,我们定义了一个名为calculate的函数,它接收一个函数参数op,类型为fn(i32, i32) -> i32,表示接收两个i32类型的参数并返回i32类型结果。函数可以返回一个值,返回值是函数的输出结果,用于提供函数执行后的结果或计算的值。函数可以接收参数,参数是函数的输入数据,用于在函数体中进行处理和操作。在上述示例中,我们定义了一个名为add的函数,它接收两个参数a和b,类型均为i32。在上述示例中,我们定义了一个名为greet的函数,它接收一个类型为&str的参数name。原创 2024-10-10 15:39:10 · 1118 阅读 · 0 评论 -
Rust编程中的循环语句
第三次temp_variable取值是lower_bound+2,然后执行代码语句,以此类推,一直到temp_variable取值upper_bound−1,此时将最后一次执行代码语句,则整个for循环结束。temp_variable是一个临时变量,取值范围是[lower_bound,upper_bound-1],也就是让temp_variable不断改变取值(从lower_bound开始,每次加1),不断执行代码语句。只要表达式为true,就可以执行循环体内的语句,否则终止循环,执行循环体外的语句。原创 2024-10-09 08:13:42 · 949 阅读 · 0 评论 -
Rust编程的匹配控制语句match
如果point的第二个元素等于0,就会执行第二个代码块,输出"The point is on the x-axis";match语句是Rust中非常强大的语言特性,它可以让我们根据不同的匹配模式执行不同的代码。其中,value是要匹配的变量,pattern是匹配模式,=>后面是要执行的代码块。match语句是Rust中的一种控制流语句,它可以让我们根据不同的模式匹配执行不同的代码。在match语句中,每个分支的代码块通常都比较复杂,因此我们应该给每个分支加上花括号,以便更好地阅读和维护代码。原创 2024-10-08 11:23:50 · 1257 阅读 · 0 评论 -
Rust编程的if选择语句
Rust语言实现选择结构时,根据某种条件的成立与否而采用不同的程序段进行处理的程序结构称为选择结构。通常选择结构有两个分支,条件为“真”,执行甲程序段,否则执行乙程序段。有时,两个分支还不能完全描述实际问题。例如,判断学生的成绩属于哪个等级(A:90~100,B:80~89,C:60~79,D:0~59),根据学生的成绩的条件分成4个分支,分别处理各等级的情况。这样的程序结构称为多分支选择结构。原创 2024-09-26 17:58:51 · 1254 阅读 · 0 评论 -
Rust格式化输出宏
我们编写程序的目的就是对输入进行处理,然后将处理结果反馈给用户,对于初学者一般是将处理结果直接显示在屏幕上。Rust语言的打印操作主要是通过在std::fmt中定义一系列宏来处理。Rust中的主要输出靠宏print!或println!,两者唯一不同的地方在于print!会将要输出的内容打印到控制台,println!会在输出的内容打印到控制台后进行换行。print!原创 2024-09-24 15:54:19 · 1341 阅读 · 0 评论 -
Rust 运算符快速了解
比如,加法操作3 + 2,这里的+是操作符,加号两边的3和2是操作数,加法符号的作用是对操作数3加上操作数2,得到计算结果5并返回5。其实,编程语言由于是给人用的,一定要考虑到人的局限性(就是面对复杂事物容易出错),所以编程语言一定要简单明了,Rust去掉了++和--,相对于C语言而言,绝对是个进步,可以从源头上尽可能防止人类出错。它做的唯一工作就是取该操作数的反面值,也就是说如果操作数值为真(true),那么运算后值变为假(false),如果操作数值为假(false),则运算结果为真(true)。原创 2024-09-21 10:10:43 · 1411 阅读 · 0 评论 -
Rust编程的作用域与所有权
计算机程序必须在运行时管理它们所使用的内存资源。大多数编程语言都有管理内存的功能:C/C++这样的语言主要通过手动方式管理内存,开发者需要手动申请和释放内存资源。但为了提高开发效率,只要不影响程序功能的实现,许多开发者没有及时释放内存的习惯。所以手动管理内存的方式常常造成资源浪费。Java语言编写的程序在Java虚拟机(Java Virtual Machine,JVM)中运行,JVM具备自动回收内存资源的功能。原创 2024-09-20 09:04:19 · 1422 阅读 · 0 评论 -
Rust的常量
常量和变量是高级程序设计语言中数据的两种表现形式。这里我们先介绍常量,常量是指程序运行过程中值始终不变的量。常量的特点是一旦被定义就不能被修改或重新定义。常量可以是一个具体的数值或一个数学表达式。例如,数学中的圆周率π,就是一个常量,它的取值是固定且不能被改变的,又如1、2、1000、5.88等数值也是常量。在Rust中,常量分为直接常量和const常量。3.3.2。原创 2024-09-12 08:38:02 · 1234 阅读 · 0 评论 -
Rust程序结构与代码注释
main函数后面的花括号之间的内容称为函数体,里面的代码就是函数功能的具体实现,花括号必不可少。所有以两个斜线符号(//)开始的程序行都被认为是注释行,这些注释行是程序员写在程序源代码内,用来对程序进行简单解释或描述,对程序本身的运行不会产生影响。程序中可以有注释行(以//开头),然后有函数的声明(本例中为main函数),最后是程序语句(例如调用println!如果你在源程序中插入了注释而没有用//符号或/*和*/符号,编译器会把它们当成Rust的语句,那么在编译时就会出现一个或多个错误信息。原创 2024-09-11 11:31:10 · 1191 阅读 · 0 评论 -
搭建Windows下的Rust开发环境
下载下来的文件是codelldb-x86_64-windows.vsix,如果不想下载,也可以在somesofts文件夹下找到,然后打开VS Code,单击左侧工具栏上的Extensions按钮,然后把文件codelldb-x86_64-windows.vsix拖入VS Code的Extensions页下的空白处,稍等片刻,VS Code右下角会提示安装完成。其中,文件Cargo.lock也是工具Cargo的元配置文件,它包含依赖的精确描述信息,它是由Cargo自行维护的,因此不需要手动修改。原创 2024-09-10 08:27:55 · 2041 阅读 · 5 评论 -
Rust编程语言的特点及其适合做什么
它保证在任何情况下,使用对象时先构造对象,再析构对象,这是一个主要与C++相关的代码习语,但该技术现在也存在于Rust中,即每次对象超出范围时,都会调用其析构函数并释放其拥有的资源,程序员不必手动执行此操作,并且可以防止资源泄露错误。例如,普通的if表达式就取代了C的三元表达式。Rust中也有引用概念(用&符号),不包含运行时引用计数,租约检查器的编译时已经验证了此类指针的安全性,阻止悬空指针和其他形式的未定义行为。Rust有一个所有权系统,所有的值都有一个唯一的属主,值的有效范围跟属主的有效范围一样。原创 2024-05-11 09:49:27 · 4422 阅读 · 0 评论 -
Rust的数据类型
在Rust编程中,所谓数据类型,就是对数据存储的安排,包括存储单元的长度(占多少字节)以及数据的存储形式。不同的数据类型分配不同的长度和存储形式。在编程时,我们将变量存储在计算机的内存中,但是计算机要知道我们要用这些变量存储什么样的值,因为一个简单的数值,一个字符或一个巨大的数值在内存中所占用的空间是不一样的。在Rust中,每个值都属于某一个数据类型,用来告诉Rust它被指定为何种数据,以便明确数据处理方式。Rust基本数据类型主要有两类子集:标量(Scalar)类型和复合(Compound)类型。原创 2024-09-05 08:01:50 · 1504 阅读 · 0 评论 -
【图书介绍】《Rust编程与项目实战》
Rust是一门系统编程语言,专注于安全,尤其是并发安全,它也是支持函数式、命令式以及泛型等编程范式的多范式语言。标准Rust在语法和性能上和标准C++类似,设计者可以在保证性能的同时提供更好的内存安全。本书详解Rust编程技巧,配套示例源码、PPT课件、作者QQ答疑服务。原创 2024-05-11 09:02:04 · 1221 阅读 · 9 评论 -
Rust线程模型与线程创建
但要注意的是,当主线程结束的时候,整个进程就结束了,此时派生线程也会结束,所以派生线程中的打印信息是不会全部输出完毕的。Rust中的致命逻辑错误会导致线程死机(也称崩溃),在此期间,线程将展开堆栈,运行析构函数并释放所拥有的资源。如果没有捕捉到死机,线程将退出,但可以选择从具有连接的其他线程检测到死机。事实上,如果线程及其返回值可以比它们的调用程序更持久,我们需要确保它们在之后是有效的,因为我们不知道它们什么时候会返回,所以需要让它们尽可能长时间地有效,也就是说,直到程序结束,因此是“静态生存期”。原创 2024-08-14 09:40:14 · 996 阅读 · 0 评论 -
Rust到底值不值得学
Rust是近两年呼声比较高的一种新型开发语言,市场占有量并不大,但增长速度极为迅猛。有人统计过,在计算机行业,平均每33.5天就有一种所谓的新型开发语言面世,这还不包括很多企业内部、项目内部的内置简易流程工具。然而大浪淘沙,如今仍然占据着市场地位的,仍然是耳熟能详的有限几种。作为新来的搅局者,Rust到底值不值得学习并且在工作中应用呢?先说结论,这里粗略地把开发者分为初学者、小有经验的常规工程师和资深开发者三类。原创 2024-08-22 16:38:11 · 1037 阅读 · 0 评论 -
快速了解Rust 的数据分析库Polars
简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言,易于阅读和编写,同时也易于机器解析和生成,并有效地提升了网络传输效率。这里需要注意,如果数据中存在空数据,则需要用None来表示,而Rust是强类型语言,需要列数据类型一致,因此,如果数据中有None存在,则其他非None数据需要用Some()包裹,达到类型一致。Polars是一个基于 Rust 的数据分析库,它的目标是提供一个高性能的数据分析工具,同时也提供了Python和JavaScript的接口,也就是说这款工具还可以供Python使用。原创 2024-08-30 15:41:31 · 1782 阅读 · 0 评论 -
Rust到底值不值得学,之二
带来的优点也是显而易见的,除刚才提过的不让程序Bug带入生产环境外,错误能在编译阶段就消除掉,无须在运行时进行更多不必要的错误检查,这也将大大地减少程序在运行时的消耗。顺便还见识了Rust中函数的嵌套写法,当然现在新兴的语言,包括C++11之后的版本,都已经支持这种写法,这在函数式(Functional Programming Paradigm,注意不是函数化Functionalization)编程中是很重要的支持。去掉之后是可以编译通过的,但仍然需要注意,y此时是可写的指针,“借用”了x的写权限。原创 2024-09-02 10:05:20 · 1408 阅读 · 0 评论 -
Rust多线程编程概述
这个实例的输出结果是随机的,主线程一旦执行完成,程序就会自动退出,不会继续等待子线程。线程是进程(Process)中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。事实上,如果线程及其返回值可以比它们的调用程序更持久,我们需要确保它们在之后是有效的,因为我们不知道它们什么时候会返回,所以需要让它们尽可能长时间地有效,也就是说,直到程序结束,因此是“静态生存期”。原创 2024-09-03 09:22:11 · 1559 阅读 · 0 评论 -
Rust模块std::thread
但是,程序通常需要特定的支持才能利用超过64个逻辑CPU,并且在没有此类支持的情况下,此函数返回的数字准确地反映了程序默认可以使用的逻辑CPU的数量。调用handle的join方法会阻止当前运行线程的执行,直到handle所表示的这些线程终结join方法返回一个线程结果值,如果线程崩溃,则返回错误码,否则返回Ok。move闭包通常和thread::spawn函数一起使用,它允许用户使用其他线程的数据,这样在创建新线程时,可以把其他线程中的变量的所有权从一个线程转移到另一个线程,然后就可以使用该变量了。原创 2024-09-04 08:48:01 · 1686 阅读 · 0 评论 -
Rust的常数、作用域与所有权
计算机程序必须在运行时管理它们所使用的内存资源。大多数编程语言都有管理内存的功能:C/C++这样的语言主要通过手动方式管理内存,开发者需要手动申请和释放内存资源。但为了提高开发效率,只要不影响程序功能的实现,许多开发者没有及时释放内存的习惯。所以手动管理内存的方式常常造成资源浪费。Java语言编写的程序在Java虚拟机(Java Virtual Machine,JVM)中运行,JVM具备自动回收内存资源的功能。原创 2024-09-06 09:39:05 · 1478 阅读 · 0 评论 -
Rust运算符
比如,加法操作3 + 2,这里的+是操作符,加号两边的3和2是操作数,加法符号的作用是对操作数3加上操作数2,得到计算结果5并返回5。其实,编程语言由于是给人用的,一定要考虑到人的局限性(就是面对复杂事物容易出错),所以编程语言一定要简单明了,Rust去掉了++和--,相对于C语言而言,绝对是个进步,可以从源头上尽可能防止人类出错。它做的唯一工作就是取该操作数的反面值,也就是说如果操作数值为真(true),那么运算后值变为假(false),如果操作数值为假(false),则运算结果为真(true)。原创 2024-09-09 08:15:55 · 1306 阅读 · 0 评论