rust
文章平均质量分 73
int8
这个作者很懒,什么都没留下…
展开
-
rust重载比较运算符
要重载比较运算符,需要为类型实现对应的trait。重载==和!=,需要实现PartialEq或者Eq重载=,需要实现PartialOrd或者Ord。原创 2023-10-25 19:20:10 · 578 阅读 · 0 评论 -
rust注释
用 cargo doc 构建文档到 target/doc。注释转换成HTML格式的说明文档。用 cargo test --doc 仅运行文档测试。下面是一些最常使用的 #[doc] 属性。用于内联文档,而不是链接到单独的页面。这些命令最终会调用 rustdoc。用于防止链接到单独的页面或其他位置。原创 2023-10-13 21:52:14 · 505 阅读 · 0 评论 -
rust宏
宏看起来和函数很像,只不过名称末尾有一个感叹号!。宏并不产生函数调用,而是展开成源码,并和程序的其余部分一起被编译。Rust宏和C不同,Rust的宏会展开为抽象语法树(AST,abstract syntax tree),而不是直接字符串替换,这样就不会产生无法预料的优先级错误。宏有两种:声明宏和过程宏。原创 2023-10-13 21:34:12 · 859 阅读 · 0 评论 -
rust属性
属性是一种由编译器使用的元数据。原创 2023-10-13 20:41:04 · 506 阅读 · 0 评论 -
rust文件读写
std::fs模块提供了结构体File,它表示一个文件。原创 2023-10-10 21:51:39 · 1462 阅读 · 0 评论 -
rust模式
模式是Rust中特殊的语法,它用来匹配值。原创 2023-10-10 20:47:24 · 470 阅读 · 0 评论 -
rust元组
(一)语法可以不显式指定类型使用一对小括号 () 把所有元素放在一起,元素之间使用逗号 , 分隔。范例没有元素的元组叫单元。单元类型和单元值都是()。原创 2023-10-08 22:55:11 · 727 阅读 · 0 评论 -
rust闭包
(一)闭包是什么我们先来看看javascript中的闭包。在函数外部无法读取函数内的局部变量。但是我们有时候需要得到函数内的局部变量,那么如何从外部读取局部变量?那就是在函数的内部,再定义一个函数。在上面的代码中,函数f2在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1就是不可见的。这就是"链式作用域",子作用域会一级一级地向上寻找所有父作用域的变量。原创 2023-10-08 22:46:29 · 746 阅读 · 0 评论 -
九、rust函数
(一)格式使用fn关键字fn是 function 的缩写1.无返回值的参数必须声明参数名称和类型函数定义时指定的参数叫做 形参。调用时传递给函数的参数叫做 实参。例子2.有返回值的(1)使用 return 关键字指定返回值(2)不使用return语句,而使用结尾表达式作为返回值结尾表达式不能由分号;结尾例子(二)语句和表达式函数体由一系列的语句和一个可选的结尾表达式构成Rust区分语句与表达式,其他语言并没有这样的区别。原创 2023-10-06 19:29:42 · 583 阅读 · 0 评论 -
八、rust流程控制
(一)if1.if语法格式例子条件表达式不需要用小括号。条件表达式必须是bool类型,如果不是 bool 类型,将得到一个错误。2.if else语法格式例子if else既可以作语句,又可以作表达式。当作表达式时,它的值是其分支代码块最后一个表达式的值。值取决于哪个代码块被执行。这意味着 if 的每个分支的可能的返回值都必须是相同类型;在上例中,if 分支和 else 分支的结果都是 i32 整型。语法格式例子(二)if let句法1.if let语法格式。原创 2023-10-06 05:46:48 · 738 阅读 · 0 评论 -
七、rust运算
不同类型不能放在一起运算。如果非要计算,必须先强转成一个类型再运算。Rust语言不支持自增自减运算符 ++ 和 --A = 2且变量B = 3。A = 10且B = 20。A = 10且B = 20。a = 10且b = 5。原创 2023-10-06 05:25:49 · 575 阅读 · 0 评论 -
六、rust字面量
字面量就是值。值最终必须编码成二进制存储在某块内存上。变量与字面量的关系就像杯子和水的关系。字面量是有类型的。字面量类型有:布尔、数字、文本、字节。原创 2023-10-06 05:14:41 · 395 阅读 · 0 评论 -
五、rust变量
(一)语法格式使用let关键字定义变量也可以不显式指定类型一些例子(二)变量可变性Rust变量分为可变的与不可变的:在默认情况下是不可变的。如果需要可变,那需要加 mut 关键字。(三)静态变量语法格式必须为静态变量提供初始化表达式,但在外部块中的静态变量必须省略初始化表达式。初始化表达式是常量表达式。可以引用其他静态变量。例子(四)常量常量类似于不可变变量,但是常量和不可变变量之间存在一些差异:变量的值是在运行时确定的,而常量的值是在编译期确定的。原创 2023-10-05 23:46:39 · 557 阅读 · 0 评论 -
rust别名
可以用type语句给已有的类型取个新的名字。新名字必须遵循驼峰命名法(像是CamelCase这样),否则编译器将给出警告。别名的主要用途是避免写出冗长类型名。如IoResult 是Result 类型的别名。原创 2023-10-05 21:59:28 · 97 阅读 · 0 评论 -
四、rust类型
isize 和 usize 类型取决于程序运行的CPU宽度: 若CPU是32位的,则这两个类型是32位的,若CPU是64位,那么它们则是64位。Rust中所有的指针都是显式的头等(first-class)值。在比较裸指针时,比较的是它们的地址,而不是它们指向的数据。它们是为了提升与外部代码的互操作性,以及编写对性能要求很高的函数或很底层的函数。元组类型的语法规则为一对圆括号封闭的逗号分割的类型有序列表。结构体与元组的区别是结构体的每个字段和其本身都有一个名字,这样访问字段的时候就不用记住下标了。原创 2023-10-05 21:47:56 · 324 阅读 · 0 评论 -
三、rust 项目组织结构
项目也叫包,英文是package,其实就是个文件夹。包名就是目录名。一个包必须有一个Cargo.toml文件。项目可以嵌套。原创 2023-10-04 10:53:53 · 1117 阅读 · 1 评论 -
二、rust cargo
Cargo是Rust的构建工具和包管理器。Cargo除了具有创建工程、构建工程、运行工程等功能,还具有下载依赖库、编译依赖等功能。真正编写程序时,我们不直接用rustc,而是用cargo。原创 2023-10-04 10:34:33 · 1181 阅读 · 0 评论 -
一、rust
(一)rust是什么Rust语言是一种高效可靠的通用高级语言。其高效不仅限于开发效率,它的执行效率也是令人称赞的,是一种少有的兼顾开发效率和执行效率的语言。Rust语言由Mozilla开发,最早发布于2014年9月。Rust的编译器是在MIT License和Apache License 2.0双重协议声明下的免费开源软件。(二)Rust语言的特点1.高性能 - Rust速度惊人且内存利用率极高。原创 2023-10-03 20:45:54 · 510 阅读 · 0 评论 -
Rust 多线程编程
一个进程一定有一个主线程,主线程之外创建出来的线程称为子线程多线程编程,其实就是在主线程之外创建子线程,让子线程和主线程并发运行,完成各自的任务。Rust语言支持多线程编程。Rust语言标准库中的 std::thread 模块用于多线程编程。std::thread 提供很很多方法用于创建线程、管理线程和结束线程。原创 2023-10-02 00:48:16 · 692 阅读 · 0 评论 -
rust智能指针
Deref隐式转换将实现了Deref的类型的引用转换为另一种类型的引用。一种无法在编译时知道大小的类型是递归类型,其值的一部分可以是自身类型的另一个值。Deref trait使智能指针表现的像引用一样,这样就可以编写既用于引用、又用于智能指针的代码。每次使用 * 时, * 运算符都被替换成先调用deref方法再使用 * 解引用的操作,且只会发生一次,不会无限递归替换 * 操作符,解引用出i32类型的值就停止了。是一个指针,它的大小是确定的,所以将Box作为Cons的成员,这样List的大小就确定了。原创 2023-09-29 23:29:58 · 743 阅读 · 0 评论 -
rust生命期
虽然可以把r的使用移到s1和s2的生命期以内避免错误,但对于函数来说,它并不知道调用者如何使用它,所以为了保障自己传递出去的值始终是可使用的,就要消除一切危险,直接不能通过编译。我们把生命期作为泛型参数,标明函数返回值的生命期与两个参数的生命期是一样的,这样就能编译通过了。这是一个历史问题,早期Rust不支持生命期自动判断,所有的生命期必须严格声明,但现在的Rust已经支持了。上图中的绿色范围’a表示r的生命期,蓝色范围’b表示x的生命期。虽然生命期的含义是变量的有效期,但其实只应用于引用。原创 2023-09-28 00:17:18 · 1112 阅读 · 0 评论 -
rust引用
在具有指针的语言中,很容易通过释放内存时保留指向它的指针而错误地生成一个悬垂指针,悬垂指针也叫野指针,是其指向的内存可能已经被分配给其它人。因为 s 是在 dangle 函数内创建的,当 dangle 的代码执行完毕后,s 将被释放。引用是指向数据的指针,它允许我们以只读或可变的方式访问数据,而不获取数据的所有权。下面例子也是错误的,因为同一时间既存在可变引用,又存在不可变引用。可变变量x和可变引用y,通过可变引用y修改了变量x的值。比如,下面例子是错误的,因为同一时间存在多个可变引用。原创 2023-09-27 23:12:59 · 564 阅读 · 0 评论 -
rust所有权
栈和堆都是程序运行时使用的内存,但是它们的结构不同。1.栈栈,英文是stack。是内存的一段区域。栈是后进先出形式的。就像薯片桶,先放进去的一片只能后拿出来。栈上存储的数据大小必须是已知且固定的。也就是说如果一个变量或数据要放到栈上,那么它的大小在编译是就必须是明确的。例如,类型为i32的变量,它的大小是固定4个字节。2.堆堆,英文是heap。是内存的另一段区域。堆内存也叫做资源。堆是缺乏组织的:当向堆放入数据时,你要请求一定大小的空间。原创 2023-09-27 20:47:30 · 570 阅读 · 0 评论 -
rust泛型
RHS=Self,Self就是泛型参数默认值,它表示实现Add的类型,在这里就是Point类型。如果实现Add时不指定RHS的具体类型,RHS的类型将是Self类型。方法mixup将一个Point点的x与Point点的y融合成一个类型为Point的新点。单态化是一个通过填充编译时使用的具体类型,将通用代码转换为特定代码的过程。在编译期,会根据指定的具体类型,生成一套特化代码,这叫单态化。展开为两个针对i32和f64的定义,接着将泛型定义替换为这两个具体的定义。原创 2023-09-24 17:08:30 · 1217 阅读 · 0 评论 -
rust trait对象
(一)语法格式trait对象是一种类型,定义语法如下dyn 约束约束是trait约束或者生存期约束。可以有多个约束,多个约束之间用+连接。例如dyn XX是一个trait。原创 2023-09-23 02:17:36 · 963 阅读 · 0 评论 -
rust trait
newtype模式是使用元组结构体创建一个新类型,这个元组结构体只有一个字段,相当于对这个字段类型的封装。如果希望新类型拥有其内部类型的每一个方法,那么可以为新类型实现Deref trait并返回其内部类型。区别在于当trait有泛型参数时,一个类型可以多次实现这个trait,每次为泛型参数指定不同的具体类型。trait定义了一组方法,其他类型可以各自实现这个trait的方法,从而形成多态。方法可以有默认实现,如果其他类型实现trait时不覆盖这些方法,将使用默认实现。关联类型是一个类型占位符。原创 2023-09-23 01:41:43 · 224 阅读 · 0 评论 -
rust错误处理
有两种错误,可恢复和不可恢复可恢复错误就是那些可被捕捉的错误,因为可以被捕捉,所以可以被矫正,让程序继续运行。比如读取不存在文件时的File Not Found错误。可恢复错误会返回一个Result的枚举。不可恢复错误就是那些致命的会导致程序崩溃的错误。这些错误一旦发生,就会让程序立即停止。比如数组越界。如果遇到不可恢复的错误,则会自动调用panic!()宏。原创 2023-09-21 23:19:11 · 225 阅读 · 0 评论 -
rust枚举
应该使用match显式处理 Err,或者调用 unwrap_or,unwrap_or_else,unwrap_or_default。应该使用match显式处理None,或者调用unwrap_or,unwrap_or_else,unwrap_or_default。应该使用match显式处理Err,或者调用unwrap_or,unwrap_or_else,unwrap_or_default。进行T的运算之前必须将其转换为T。Some(T) 表示可有可无中的有,既然有,那么就一定有值,那个T就表示值的类型。原创 2023-09-21 23:01:57 · 413 阅读 · 0 评论 -
rust类型转换
类型转换类型转换分为隐式类型转换和显式类型转换。隐式类型转换是由编译器完成的,开发者并未参与,所有又称强制类型转换。显式类型转换是由开发者指定的,就是一般意义上的类型转换。原创 2023-09-21 13:49:09 · 1606 阅读 · 0 评论 -
rust字符串
如果返回的迭代器离开作用域而没有被丢弃 (例如,由于core::mem::forget),则字符串可能仍包含任何耗尽字符的副本,或者可能任意丢失字符,包括范围外的字符。而使用下标只能获得一个字节,显然这一个字节是不能代表字符的。模式 可以是 &str,char,&[char],也可以是确定字符是否匹配的函数或闭包。模式 可以是 &str,char,&[char],也可以是确定字符是否匹配的函数或闭包。模式 可以是 &str,char,&[char],也可以是确定字符是否匹配的函数或闭包。原创 2023-09-21 01:40:53 · 729 阅读 · 0 评论 -
rust迭代器
迭代器用来遍历容器。迭代器就是把容器中的所有元素按照顺序一个接一个的传递给处理逻辑。Rust中的迭代器标准库中定义了Iterator特性实现了Iterator特性的结构体就是迭代器。很多类型都有iter()方法,返回一个Iter结构体,该结构体实现了Iterator特性。原创 2023-09-19 17:24:58 · 745 阅读 · 0 评论 -
rust容器
标准库提供了常见的容器。包括向量 ( Vector )、映射( HashMap )、集合( HashSet )。原创 2023-09-18 21:54:20 · 633 阅读 · 0 评论 -
rust切片
它是动态大小类型,所以要使用切片类型,就必须使用它的指针类型。引用是最常用的指针类型。访问切片内容的时候,下标索引是从 0 开始的。&mut [T],可变切片,是可变引用。&[T],共享切片,是不可变引用。n]能隐式转换成[T]。只能通过引用的方式传递给函数。切片是序列的一个片段。data是个数组或向量。data是个数组或向量。(四)切片作为函数参数。切片类型写为[T]。原创 2023-09-18 21:09:14 · 619 阅读 · 0 评论 -
rust数组
数组分配在栈上,但Rust中,栈的大小是有限制的。首选sort_unstable_by_key(),因为它比sort_by_key()快,并且不分配辅助内存。引用传递 就是传递数组在内存上的位置给函数做参数,因此函数对数组的任何修改都会影响到原来的数组。首选sort_unstable_by(),因为它比sort_by()快,并且不分配辅助内存。传值传递 就是传递数组的一个副本给函数做参数,函数对副本的任何修改都不会影响到原来的数组。sort_by_key()与sort_unstable_by_key()原创 2023-09-17 14:46:00 · 628 阅读 · 0 评论 -
rust结构体
newtype模式是使用元组结构体创建一个新类型,这个元组结构体只有一个字段,相当于对这个字段类型的封装。注意,在调用结构体方法的时候不需要填写self,这个参数的传递Rust编译器会 偷偷的 帮我们完成。取消最后一行的注释,就会报错。结构体方法的第一个参数必须是 &self,不需指定类型,因为self是关键字。与 C++不同的是,Rust中的结构体方法只能定义在结构体的外面。元组结构体的形式是元组,与元组的区别是它有名字和固定的类型格式。方法和函数的区别就是,方法是用来操作结构体实例的,而函数则不是。原创 2023-09-16 00:08:22 · 384 阅读 · 0 评论 -
rust输入输出
很多语言获取命令行参数,是通过主函数的参数获得的。但Rust主函数是个无参数函数,命令行参数只能通过std::env::args()函数获得。std::env::args()返回一个迭代器,其中包含了程序名和后面所有参数。实例可以在launch.json中的"args": []设置命令行参数。原创 2023-09-13 23:50:07 · 1200 阅读 · 0 评论