- 2024-11-12
-
加入了学习《【2024 DigiKey创意大赛】+智慧焊接工作台》,观看 智慧焊接工作台
- 2024-06-30
-
回复了主题帖:
《Rust实战》书友互动第十一集:内核
吾妻思萌 发表于 2024-6-28 09:02
一个小问题:
作为业余感兴趣去学习Rust的有一丝丝编程基础的人,Rust是否是太过于coding硬核了,像是很 ...
接触这个语言主要是碰到有些网络通信协议用到了这个语言
- 2024-06-19
-
回复了主题帖:
《Rust实战》书友互动第十集:进程、线程和容器
rust线程之间的通信手段有哪些?
- 2024-06-16
-
发表了主题帖:
rust实战-数据1
## 1.数据
* 在println!中的{:016b}打印16位的二进制数据,位数不顾左侧补零;
* 在println!中的{:032b}打印32位的二进制数据,位数不顾左侧补零;
* `std::mem::transmute()` 把一个f32直接解释成(转换)一个u32,但是这种强行转换在rust被认为是一种混乱的行为,所以在使用此转换时需要使用unsafe包装,此代码块中编译器不提供内存安全性的保证:
```rust
let a: f32 = 42.42;
let frankentype: u32 = unsafe {
std::mem::transmute(a) // 此花括号里面没有分号,所以此表达式的结果将被传到其外部作用域中;
};
```
- 2024-05-26
-
发表了主题帖:
rust实战-生命周期、所有权、引用 4
## 4、生命周期、所有权、引用
rust 中的移动指的是所有权的移动,而不是数据的移动;
### 4.1 基本类型的特殊行为
* rust 中基本类型是有特殊行为的:这些类型实现了copy trait,基本类型具有复制语义,其他类型都具有移动语义;
* 如果一个函数获取了参数的所有权,那么此函数的外部作用域中,该参数所对应的值就无法再被访问了;
### 4.2 所有权
* 在不需要完整所有权的地方,使用引用;
* 重构代码,减少长存活期的值;
* 在需要完整所有权的地方,复制长存活期的值;
* 把数据包装到能帮助解决移动问题的类型中;
* 降低所需的访问级别,不去请求所有权,就需要在函数定义中使用引用(使用引用来避免所有权的问题),对于只读的访问使用&T,对于读写的访问使用&mut T;
* 在函数希望调整其参数的生命周期时,需要参数的所有权;
* 使用所有权,to变量的所有权移动到send()中,当send()返回时同就被删除:
```rust
fn send(to: CubeSat, msg: Message){
to.mailbox.message.push(msg);
}
```
* 使用一个可变的引用,在CubeSat类型上添加&mut 前缀,这允许在外部作用域中一直持有to变量所指向的数据的所有权;
```rust
fn send(to: &mut CubeSat, msg: Message){
to.mailbox.message.push(msg);
}
```
* 每个对象有唯一的所有者,这需要对软件进行大量的提前规划和重构;
* 重构工作量通常比较大,有时可以通过复制值来替代重构,虽然这将会带来一些额外的开销,但这种方法还是比较有用的。在rust的基本数据类型已经集成了copy方法,而且这种复制方法在CPU是开销比较低的,所以直接使用复制就可以避免去考虑对象的所有权的移动;
* 由实现了copy的类型所组成的类型来派生copy,`#[derive(Copy,Clone,Debug)]`会告诉编译器自动为每个trait添加一个copy实现;
* rust允许程序员选择性使用垃圾收集器---使用wrapper(包装器);
* RT表示一个类型为T的引用计数值,其提供了T的共享式所有权,共享式所有权能够防止T从内存中被删除,直到所有的所有者都被删除为止;引用计数用来跟踪有效引用的,每当创建出一个引用的时候,其内部的计数器就会加一,同样每当引用被删除的时候,该计数器就会减一,如果此计数器的值变成零了,那么T也就被删除了;
- 2024-05-23
-
回复了主题帖:
《Rust实战》书友互动第六集:内存,有啥你不熟悉的吗?
哪位大佬总结一下Rust管理内存有哪些方式?
- 2024-05-12
-
发表了主题帖:
rust实战-复合数据类型3
本帖最后由 IC爬虫 于 2024-5-12 17:47 编辑
## 3、复合数据类型
### 3.1 特殊返回值
* 有些返回值是由符号而不是文字组成的;
* ()类型的返回值叫做单元类型,可以用来表示一个函数没有返回值,没有返回类型的函数会返回();
* 以分号结尾的表达式也返回(),如果不想函数返回一个单元类型,就要注意函数的最后一个表达式不应该以分号结尾;
* !类型叫做Never类型,用于表示一个函数永不返回,如果一个函数保证会奔溃时,那么将永不返回;
### 3.2 方法
* 方法就是与某个对象耦合在一起的函数;
* 方法不需要指定其中一个参数的函数;
* 方法在调用时使用点操作符,并且允许其主对象隐式的传入;
* 使用impl代码块定义方法,示例:
```rust
impl FiLE{ //impl 代码块
fn new(name: &str) -> File { //File::new()就是一个普通的函数,需要高速rust此函数将返回一个File
File {
name: String::from(name),
data: Vec::new(), //File::new()仅仅是封装了创建对象语法,这也是不同的语法
}
}
}
```
### 3.3 正确、错误返回值
* 一个全局变量静态可变(可变静态),它拥有静态生命周期,在程序的整个生命周期它都是有效的;
* 可变全局变量使用static mut来表示;
* 惯例全局变量名使用全大写;
* 使用const关键字表示永不变的值;
* 要访问并修改可变静态变量,必须使用unsafe块,也就是编程人员需要承担编译器的职责,对unsafe块中的代码进行负责;
* const和let的区别:let定义的变量默认值是不可变的,但是let后面的数据还是可能被修改的->rust允许某些类型有一个明显矛盾的内部可变性的属性;
* 使用Result提供了编译器辅助下的代码正确性,其是标准库中定义的一个枚举体,它与其他的类型有着相同的地位;
### 3.4 枚举
* 枚举体是一个类型,可以表示多个已知的选项;
* 将枚举与rust的模式匹配功能一起使用,可以帮助你的代码健壮和易读;
* 与结构体类似,枚举同样支持使用impl块来实现方法;
* 使用枚举比使用常量数组更加强大易理解;
* 枚举体中的每个元素使用逗号隔开,以后以元素也是使用逗号结尾;
### 3.5 使用trait定义共有的行为
* trait让编译器知道,有多个类型试图执行同一个任务;
* trait关键字用于定义一个trait,而impl关键字可以用来给一个具体的类型附加上某个trait;
- 2024-05-06
-
回复了主题帖:
《Rust实战》书友互动第四集:生命周期、所有权和借用
lugl4313820 发表于 2024-5-6 17:28
Rust的所有权系统是非常出色的。但是用得不好,就会让你遇到不少的麻烦。文中提到有哪4个解决所有权的策略 ...
1、在不需要完整所有权的地方使用引用;
2、重构代码,减少长存活期的值;
3、在需要完整所有权的地方复制长存活期的值;
4、把数据包装到能帮助解决移动问题的类型中;
- 2024-04-28
-
回复了主题帖:
rust实战-rust语法2
hellokitty_bean 发表于 2024-4-28 10:27
“通过切片可以获得对原数据快速、只读的访问,而不需要任何形式的复制”
对这一句深为迷惑 ...
对
- 2024-04-27
-
发表了主题帖:
rust实战-rust语法2
### 2.4 语法2
* 字符串的方法`lines()`表示按行迭代;
* 字符串的方法`contains()`表示支持文本查找是否有包含的字段;
* String字符串类型和C语言中的类似,可以进行字符串的拼接、将新字符串附加到现有字符串上、可以修建空白符、使用动态内存分配存储它所表示的文本;
* str是高性能但功能较少的字符串类型,一旦被创建就不能再被扩大或者缩小,可以被认为是只读的数据,类似创建了一个固定长度的数组;
* rust中最常用用于表示数据列表的数据类型为数组和动态数组,其中动态数组是可增长的,但是会带来运行开销;
* [T;n]表示的数组类型中,T是数组元素的数据类型,n是一个非负的整数表示为定义的数组的长度;
* 数组类型和切片类型是不同的,切片类型是没有编译期长度的;
* rust会对数组索引做边界的检查,请求的元素超出数组的边界将会使程序奔溃,而不会返回错误的数据;
* 切片(slice)是动态大小的类型组对象,动态大小指的是编译期长度位置,和数组类似也是不能扩展和收缩的,这里的动态指的是动态的类型,而不是说长度是可变的;
* 切片更容易实现trait,这是因为其本身不需要与特定的长度进行绑定;
* 通过切片可以获得对原数据快速、只读的访问,而不需要任何形式的复制
* 动态数组(vector)是一个元素类型为T的可增长列表;
* rust使用`cargo add`添加第三方代码,再执行`cargo build`将会开始下载刚添加的第三方代码;
* rustup提供了访问多个编译器工具链的能力,还有访问语言级文档的功能;
- 2024-04-21
-
发表了主题帖:
rust实战-rust语法1
本帖最后由 IC爬虫 于 2024-4-21 22:17 编辑
### 2.4 语法
* rust没有goto关键字,沟通提供了跳转到程序其他部分的能力,goto会使得程序的控制流程变得混乱,可以使用循环标签实现这种跳转模式;
* 在rust 的if语法中不能使用0或者空字符串代表false,而其他值代表true,唯一可以用作true的值就是true自己,同样的可以用作false的值也只有false自己;
* rust是一门基于表达式的语言,所有表达式都会有返回值,而且大部分东西都是表达式,在rust的惯用语法中,函数会省略return关键字;
* rust会通过条件表达式给变量赋值;
* break关键字也可以返回一个值;
* 比条件语句 if else更安全的选择是match,当你没有考虑到所有可能时match会报警告;为了匹配多个可能的值提供以下三种语法:
* 匹配范围`10 ..=20`->会匹配此范围内的所有制;
* 布尔或`|`->会匹配两端的任何一个值;
* 下划线`_`->会匹配所有值;
* match有点类似c语言中的switch,但是和switch不同的是match要保证一个类型的所有可能情况都会显式地得到处理;如果match的各个分支没有覆盖到所有可能的情况,编译器将报错;另外入如果match匹配到一个分支后,match就会立即返回;
* 在rust的函数定义中,必须显式的制定函数的参数类型和返回值类型;
* rust中引用语法有点像指针的用法,避免复制开销;
* rust的安全性检查是基于生命周期系统的,因为生命周期系统能够验证所有对数据的访问是否有效;通常编译器自己可以推断出大部分参数的生命周期,但是有时推理参数的生命周期时会遇到困难,通常就直接报个错提示,此时编译器就需要协助了,这时生命周期注解就非常有必要了;
* 在rust中为了让函数能处理多种输入类型的数据使用泛型函数,在类型注释的位置上使用大写字母表示一个泛型类型,常用变量T、U、V来作为泛型类型的占位符,但实际上可以使用任意的其他名字,E经常用来表示错误类型;---泛型让代码可以重用;使用任意类型时需要注意,有写类型是不支持特定的操作的,这时就需要给这个任意类型做个限定-trait bound,比如:`fn add(i: T, j: T) -> T`这里表示要求T必须实现std::ops::Add,在这个trait限定中,使用了单个类型变量T,这保证了参数i和j以及函数的结果都是同一个类型,并且它们的类型都是支持加法运算的;
- 2024-04-14
-
发表了主题帖:
rust实战-rust数据类型1
### 2.3 数据类型
* 内置对二进制(0b)、八进制(0o)、十六进制(0x)数字字面量的支持;
* 占用更多位数的类型可以表示更多的数字,代价就是需要为较小的数字存储更多额外的零;
* 不同的数据类型不能进行比较运算,不同类型需要进行比较运算的话可以使用`as`将其中一个操作数转换为与另外一个操作数相同的类型,例如:if a
- 2024-04-09
-
回复了主题帖:
rust实战-rust开发环境安装-ubuntu22.04
lugl4313820 发表于 2024-4-9 17:21
感谢分享呀,编译速度如何,我在win下面是有点点难等呀。
编译1秒内
-
发表了主题帖:
rust实战-rust特征
## 2、rust特征
### 2.1 优点
rust主要特色就是编译时就防止对无效数据的访问--内存安全性,rust早期的宣传语:其实一门运行极快,能防止出现段错误并能保证线程安全的系统编程语言。
rust提供的内存安全性是不依靠垃圾回收器的;
rust通常使用数组来保存数据,而不是由指针创建深层嵌套的树结构--面向数据编程;
具有现代化的包管理器-cargo,方便获取数以万计的开源软件集成到自己的项目中,让构建具有众多依赖关系的项目变得简单;
除非显式申请内存,否则总是采用静态申请内存,这方便编译器极大优化代码,消除函数调用的开销;
适合编写并行/并发程序;
### 2.2 缺点
难对循环数据进行建模,rust的安全性检测会妨碍实现类似双向链表的代码编写,所以需要避免去实现这类数据类型;
rust编译速度较慢,因rust编译器工具链较复杂;rust程序编译单元不是一个单独的文件,而是一个完整的程序包。如果rust程序包含了众多模块,编译时就是一个非常大的编译单元,从而托慢编译速度,但是好处就是可以基于整个程序就行优化。
rust编译检测是比较严格的,也是为了保证程序的稳定性;
- 2024-04-08
-
发表了主题帖:
rust实战-rust开发环境安装-ubuntu22.04
## 1、rust开发环境安装-ubuntu22.04
### 1.1 使用rustup在 Ubuntu 上安装 Rust
* 官方推荐使用rustup命令行工具安装rust,安装命令`curl --proto '=https' --tlsv1.3 https://sh.rustup.rs -sSf | sh`;
* 在使用上面命令安装耗时较长,大概10分钟,安装过程输出的log如下:
```sh
https://sh.rustup.rs -sSf | sh
info: downloading installer
Welcome to Rust!
This will download and install the official compiler for the Rust
programming language, and its package manager, Cargo.
……
This is usually done by running one of the following (note the leading DOT):
. "$HOME/.cargo/env" # For sh/bash/zsh/ash/dash/pdksh
source "$HOME/.cargo/env.fish" # For fish
```
* 将Rust工具链目录添加到PATH环境变量中,执行命令:`. "$HOME/.cargo/env"`;
### 1.2 验证rust是否正确安装
* 执行命令:`rustc --version`,正确输出如下:
```sh
yq@yq-SER:~/workspace/porject/rust_lab$ rustc --version
rustc 1.77.1 (7cf61ebde 2024-03-27)
```
### 1.3 安装编译器
* `sudo apt-get update`
* `sudo apt-get upgrade`
### 1.4 测试程序
* `mkdir rust_lab`
* `cd rust_lab`
* `cargo new hello`
* `cd hello`
* `cargo run`执行之后,输出如下log:
```sh
yq@yq-SER:~/workspace/porject/rust_lab/hello$ cargo run
Compiling hello v0.1.0 (/home/yq/workspace/porject/rust_lab/hello)
Finished dev [unoptimized + debuginfo] target(s) in 0.16s
Running `target/debug/hello`
Hello, world!
```
* `tree hello`查看创建的hello这个工程的目录结构如下:
```sh
hello
├── Cargo.lock
├── Cargo.toml
├── src
│ └── main.rs
└── target
├── CACHEDIR.TAG
└── debug
├── build
├── deps
│ ├── hello-be6bda56910dedd3
│ └── hello-be6bda56910dedd3.d
├── examples
├── hello
├── hello.d
└── incremental
└── hello-162da77oboroz
├── s-gv15zucml6-1qrls1l-haluob5sz2geps0yyxccoril
│ ├── 3y2axdyeswww69bo.o
│ ├── 3yic78025suogjt0.o
│ ├── 49xwdjds89qd3h5o.o
│ ├── 56gh54vvdral8q2a.o
│ ├── cvi7dk12v8evtsp.o
│ ├── dep-graph.bin
│ ├── l23glj4h2qa8l7q.o
│ ├── query-cache.bin
│ └── work-products.bin
└── s-gv15zucml6-1qrls1l.lock
9 directories, 18 files
```
-
回复了主题帖:
《Rust实战》书友互动第一集:Rust语言你知多少
chejm 发表于 2024-4-8 06:30
有哪位朋友能简单介绍一些Rust语言的相关知识吗,语言的最大亮点,主要应用领域
目前看到在网络通信中有使用
- 2024-04-01
-
回复了主题帖:
读书活动入围名单:《Rust实战》,追加了5本
个人信息无误,确认可以完成阅读分享计划
- 2024-01-23
-
回复了主题帖:
【Luckfox幸狐 RV1106 Linux 开发板测评】一、开箱及测试
你的板子是RV1106
- 2024-01-17
-
回复了主题帖:
EEWorld 社区 2023年度人物颁奖
感谢论坛!
个人信息已确认。
- 2024-01-08
-
回复了主题帖:
聊点成人话题,现在月薪多少
Nubility 发表于 2024-1-8 09:40
也算是一个参考吧,也仔细琢磨一下是自己的实力只值那么点工资还是自己不会谈工资,会谈工资的有时候也能 ...
你都无法知道投票人对应薪资下的能力,你怎么参考的?
薪资不是你要得高别人就会给你的