分享Rust编程语言的相关知识笔记,持续更新中!
本章介绍Rust的基础学习,包含使用Clion,关键字,变量,数据类型,函数等!
1. 使用IDEA
一直使用终端,界面不太友好,对我们来说操作还是有一定的难度,我们可以选择现成的IDEA,Vscode,Clion进行项目开发!(前提:已经下载好装好Rust!!!)
- 打开IDEA插件,搜索Rust,下载,然后重启IDEA
- 新建项目->选择Rust->创建
- 一个基础的Rust项目我们就创建好了,下面将介绍一些基本通用的编程概念!
2. Rust编程基础概念
2.1 关键字
Rust 语言有一组保留的 关键字(keywords),就像大部分语言一样,它们只能由语言本身使用。记住,你不能使用这些关键字作为变量或函数的名称。大部分关键字有特殊的意义,你将在 Rust 程序中使用它们完成各种任务;一些关键字目前没有相应的功能,是为将来可能添加的功能保留的。可以在Rust程序设计语言附录 A 中找到关键字的列表
2.2 变量
2.2.1 不可变量
在Rust中,变量默认是不可改变的!Rust 编译器保证,如果声明一个值不会变,它就真的不会变。这意味着当阅读和编写代码时,不需要追踪一个值如何和在哪可能会被改变,从而使得代码易于推导。
2.2.2 可变变量
如果想使自己的变量可以改变,只需要在变量前面添加
mut
即可!
既然有了可变变量的选择,那我们在平时打代码该选择可变的还是不可变的!这边官方给出的建议是权衡取舍!例如,使用大型数据结构时,适当地使用可变变量,可能比复制和返回新分配的实例更快。对于较小的数据结构,总是创建新实例,采用更偏向函数式的编程风格,可能会使代码更易理解,为可读性而牺牲性能或许是值得的。
2.2.3 变量和常量的区别
我们学习JAVA或者其他一些编程语言的时候也学到了常量,也是不能改变的量!在Rust中变量是默认不可改变的,而常量是一定不可以改变的!
声明常量使用关键字
const
而不是
let
,而且必须要注明值的类型!
常量可以在任何作用域中声明,包括全局作用域,这在一个值需要被很多部分的代码用到时很有用。
(Rust 常量的命名规范是使用下划线分隔的大写字母单词,并且可以在数字字面值中插入下划线来提升可读性)
2.2.4 隐藏
我们可以定义一个与之前变量同名的新变量,而新变量会 隐藏 之前的变量。Rustacean 们称之为第一个变量被第二个 隐藏 了,这意味着使用这个变量时会看到第二个值。可以用相同变量名称来隐藏一个变量,以及重复使用
let
关键字来多次隐藏.
mut
与隐藏的另一个区别是,当再次使用
let
时,实际上创建了一个新变量,我们可以改变值的类型,但复用这个名字。
3. 数据类型
Rust 是 静态类型(statically typed)语言,也就是说在编译时就必须知道所有变量的类型。
3.1 标量类型
3.1.1 整形
有符号 和 无符号 代表数字能否为负值,不知道使用哪种类型的数字时,我们使用Rust默认的类型即可!
3.1.2 浮点型
Rust 也有两个原生的 浮点数(floating-point numbers)类型,它们是带小数点的数字。Rust 的浮点数类型是
f32
和
f64
,分别占 32 位和 64 位。默认类型是
f64
,因为在现代 CPU 中,它与
f32
速度几乎一样,不过精度更高。
数值运算
Rust 中的所有数字类型都支持基本数学运算:加法、减法、乘法、除法和取余。
3.1.3 布尔型
正如其他大部分编程语言一样,Rust 中的布尔类型有两个可能的值:
true
和
false
。
3.1.4 字符类型
Rust 的
char
类型是语言中最原生的字母类型。Rust 的
char
类型的大小为四个字节(four bytes),并代表了一个 Unicode 标量值(Unicode Scalar Value),这意味着它可以比 ASCII 表示更多内容。在 Rust 中,拼音字母(Accented letters),中文、日文、韩文等字符,emoji(绘文字)以及零长度的空白字符都是有效的
char
值!
3.2 复合类型
3.2.1 元组
元组是一个将多个其他类型的值组合进一个复合类型的主要方式。元组长度固定:一旦声明,其长度不会增大或缩小。
tup
变量绑定到整个元组上,因为元组是一个单独的复合元素。为了从元组中获取单个值,可以使用模式匹配(pattern matching)来解构(destructure)元组值。
除了使用模式匹配解构外,也可以使用点号(
.
)后跟值的索引来直接访问它们。
元组的第一个索引值是 0
let u: (i32, i32, f64, char) = (1, 2, 3.1, 'a');
3.2.2 数组
与元组不同,数组中的每个元素的类型必须相同。Rust 中的数组与一些其他语言中的数组不同,因为 Rust 中的数组是固定长度的:一旦声明,它们的长度不能增长或缩小。
Rust 中,数组中的值位于中括号内的逗号分隔的列表中,数组非常有用。但是数组并不如 vector 类型灵活。vector 类型是标准库提供的一个 允许 增长和缩小长度的类似数组的集合类型。当不确定是应该使用数组还是 vector 的时候,你可能应该使用 vector
let a = [1,2,3,4];
print!("{}",a[2]);
4. 函数
函数遍布于 Rust 代码中。你已经见过语言中最重要的函数之一:
main
函数,它是很多程序的入口点。你也见过
fn
关键字,它用来声明新函数。
Rust 代码中的函数和变量名使用 snake case 规范风格。在 snake case 中,所有字母都是小写并使用下划线分隔单词。这是一个包含函数定义示例的程序:
Rust 不关心函数定义于何处,只要定义了就行!
4.1 函数参数
函数也可以被定义为拥有 参数(parameters),参数是特殊变量,是函数签名的一部分。当函数拥有参数(形参)时,可以为这些参数提供具体的值(实参)。技术上讲,这些具体值被称为参数(arguments),但是在日常交流中,人们倾向于不区分使用 parameter 和 argument 来表示函数定义中的变量或调用函数时传入的具体值。
必须要声明每个参数的类型!当一个函数有多个参数时,使用逗号分隔!
fn main() {
test(1,4);
}
fn test(x:i32,y:i32){
print!("{}",x+y);
}
4.2 返回值
Rust 是一门基于表达式(expression-based)的语言,这是一个需要理解的(不同于其他语言)重要区别。
表达式的结尾没有分号。如果在表达式的结尾加上分号,它就变成了语句,而语句不会返回值
函数可以向调用它的代码返回值。我们并不对返回值命名,但要在箭头(
->
)后声明它的类型。在 Rust 中,函数的返回值等同于函数体最后一个表达式的值。使用
return
关键字和指定值,可从函数中提前返回;但大部分函数隐式的返回最后的表达式。
5. 注释
在 Rust 中,注释必须以两道斜杠开始,并持续到本行的结尾。对于超过一行的注释,需要在每一行前都加上
//
,像这样:
6.if
fn main() {
let number = 3;
if number < 5 {
println!("condition was true");
} else {
println!("condition was false");
}
}
fn main() {
let number = 6;
if number % 4 == 0 {
println!("number is divisible by 4");
} else if number % 3 == 0 {
println!("number is divisible by 3");
} else if number % 2 == 0 {
println!("number is divisible by 2");
} else {
println!("number is not divisible by 4, 3, or 2");
}
}
fn main() {
let condition = true;
let number = if condition {
5
} else {
6
};
println!("The value of number is: {}", number);
}
不像 Ruby 或 JavaScript 这样的语言,Rust 并不会尝试自动地将非布尔值转换为布尔值。必须总是显式地使用布尔值作为
if
的条件。
7.循环
Rust 有三种循环:
loop
、
while
和
for
loop
关键字告诉 Rust 一遍又一遍地执行一段代码直到你明确要求停止,使用关键字
break
跳出循环!
fn main() {
loop{
println!("aaa");
}
}
fn main() {
let mut a = 2;
while a != 0 {
println!("a");
a=a-1;
}
}
fn main() {
let a = [1,2,3,6,7];
for i in a.iter(){
println!("{}",i)
}
}