# 一.语法
前言
主要由关键字
、标识符
、操作符
组合成一条语句
,在对应的环境
中执行
这些语句
得到最终结果
# 1.关键字
# 1.1 重点关键字
- let:声明变量的关键字。用于创建一个新的变量并将其绑定到一个值。
- const:声明常量的关键字。常量是一个不可变的值,在编译时就已经确定了。
- mut:声明可变绑定的关键字。用于创建一个可变的变量绑定。
- fn:声明函数的关键字。用于定义一个函数及其参数、返回类型和函数体。
- return:从函数中返回值的关键字。
- if:条件语句的关键字。用于根据条件执行不同的代码分支。
- else:if 条件不满足时执行的分支的关键字。
- use:导入模块或项的关键字。用于在代码中使用其他模块中定义的函数、结构体等。
- true:布尔型字面量,表示 true。
- false:布尔型字面量,表示 false。
- loop:无限循环的关键字。用于反复执行一段代码,直到遇到 break 关键字。
- for:用于迭代集合或范围的关键字。
- in:在 for 循环中指定集合元素的关键字。
- mod:声明模块的关键字。用于组织代码并将相关的项(函数、结构体等)放在同一个作用域中。
- match:模式匹配语句的关键字。用于根据一个或多个模式选择相应的执行分支。
- enum:声明枚举类型的关键字。枚举类型允许定义一个值只能为几个预定义选项之一的类型。
# 1.2 其他关键字
- crate:表示当前代码所在的 crate(代码库)的关键字。
- impl:实现接口(trait)或类型的关键字。用于为类型提供方法实现或为接口定义默认实现。
- extern:与外部代码(通常是其他语言编写的)进行交互的关键字。
- as:类型转换关键字。可以将一个值转换为另外一个类型。
- async:声明异步函数的关键字。异步函数可以暂停执行,等待某些操作完成后再继续执行。
- await:等待异步操作完成的关键字。用于在异步函数中暂停执行,等待异步操作的结果。
- break:跳出循环的关键字。用于提前终止循环并跳出循环体。
- continue:跳过本次循环的剩余部分,进行下一次循环的关键字。
- dyn:指明动态分发类型的关键字。用于定义和使用 trait 对象。
- move:将闭包获取所有权的关键字。用于强制闭包获取其使用的变量的所有权。
- pub:声明公共项(函数、结构体等)的关键字。用于指定一个项对外部可见。
- ref:声明引用的关键字。用于创建一个引用,允许在不转移所有权的情况下访问数据。
- Self:表示实现 trait 的类型自身的关键字。
- self:表示当前实例的关键字。在方法定义中使用,表示实例本身。
- static:声明静态变量的关键字。静态变量在程序的整个生命周期内保持不变。
- struct:声明结构体类型的关键字。结构体是一种用户自定义的数据类型,用于组合多个值。
- super:表示父模块的关键字。
- trait:声明 trait 的关键字。trait 定义了一组行为,可由多个类型实现。
- type:声明类型别名的关键字。可以为某个类型定义一个别名。
- unsafe:标记代码块为不安全的关键字。允许执行一些 unsafe 操作,如访问原始指针和执行未定义行为。
- where:在泛型约束中指定额外的条件的关键字。
- while:循环语句的关键字。用于反复执行一段代码,直到给定条件不再满足。
# 1.3 保留字
# 2.标识符
- 变量、常量、属性、函数、函数参数的名称
# 2.1 变量
- 变量包含:
变量名称
、变量类型
、变量所存储的值
、指向所存储的位置
# 2.1.1 名称
- 区分大小写
- 不能用关键字
- 当首字符是字母的时候:余下的字符可以是字母或者下划线( _ )
- 当首字符是下划线 ( ) 时候:标识符长度必须不能小于两字符,余下的字符可以是字母或者下划线( )
- raw identifier:有的时候你不得不使用 关键词(keyword),比如,当你需要调用一个 c 语言库,碰巧它有个函数名称叫做 match, 为了正常调用这个时候,我们就需要用到 raw identifier 了. 使用方法很简单,在函数的开头加上 r# 符号即可
- 变量名称不能是
关键字
或保留字
# 2.1.2 类型
可以不用带类型,rust 会自动推倒类型
# 2.1.3 值
值可以是多种数据类型,不同数据类型存储位置不一样
# 2.1.4 指向
变量名称指向变量数据存储的位置
- 1.变量定义同时赋值
let a = 1
1
- 2.定义时未赋值,重新赋值
let a:i32;
a = 456;
1
2
2
3.重新赋值
变量赋值前提是此变量为
可变变量
,用关键字mut
标识,未标识的为不可变变量
不能赋值
let mut a = 1;
a = 456;
1
2
2
- 4.重新绑定
let a = 123; // 可以编译,但可能有警告,因为该变量没有被使用
let a = 456;
1
2
2
# 2.2 常量
- 常量包含:
常量名称
、常量类型
、常量所存储的值
、指向所存储的位置
# 2.2.1 名称
- 通常用大写字母表示,中间用
_
连接
const NUM_PIE: f64 = 3.14; // NUM_PIE
1
# 2.1.2 类型
常量后面需要指明常量的类型,与变量不同点在于,常量定义的时候要指定类型
const PIE: f64 = 3.14; // f64类型
1
# 2.1.3 值
值可以是多种数据类型,不同数据类型存储位置不一样
# 2.1.4 指向
常量名称指向常量数据存储的位置
- 1.和变量不一样的是常量定义需要同时赋值,不能重新赋值,不能重新绑定
const a: i32 = 1;
1
对比变量常量有以下限制:
- 1.不可以对常量使用
mut
关键字 - 2.常量必须明确数据类型。定义常量时不能使用类型推断的能力。
- 3.常量可以在任意范围声明。全局常量、函数内常量
- 4.常量只能绑定到一个常量表达式,在编译期间就可以知道对应的值,不可依赖运行期的变量表达式或值
# 2.3 函数
函数由相关关键字
来声明
函数,由函数名
和()
包裹的参数
及{}
包裹的函数体
# 2.3.1 名称
关键字fn
用于声明
函数,后跟函数名
fn view() {}
1
# 2.3.2 参数
Rust 中定义函数如果需要具备参数必须声明参数名称和类型
fn another_function(x: i32, y: i32) {
println!("x 的值为 : {}", x);
println!("y 的值为 : {}", y);
}
1
2
3
4
2
3
4
# 2.3.3 函数体
函数体由一系列可以以表达式(Expression)结尾的语句(Statement)组成
# 2.3.4 返回值
在参数声明之后用 -> 来声明函数返回值的类型
函数体中,随时都可以以 return 关键字结束函数运行并返回一个类型合适的值
fn add(a: i32, b: i32) -> i32 {
return a + b;
}
1
2
3
2
3
# 2.4 属性
# 2.4.1 名称
# 2.4.2 值
# 2.4.3 引用
# 3.运算符
# 3.1 算术运算符
运算符 | 描述 | 示例 |
---|---|---|
+ | 加法运算符 | x + y 表示计算 x 加 y 的和 |
- | 减法运算符 | x - y 表示计算 x 减 y 的差 |
* | 乘法运算符 | x * y 表示计算 x 乘 y 的积 |
/ | 除法运算符 | x / y 表示计算 x 除以 y 的商 |
% | 取模(取余)运算符 | x % y 表示计算 x 除以 y 的余数 |
# 3.2 赋值运算符
运算符 | 描述 | 示例 |
---|---|---|
= | 最简单的赋值运算符,将运算符右侧的值赋值给运算符左侧的变量 | x = 10 表示将变量 x 赋值为 10 |
+= | 先进行加法运算,再将结果赋值给运算符左侧的变量 | x += y 等同于 x = x + y |
-= | 先进行减法运算,再将结果赋值给运算符左侧的变量 | x -= y 等同于 x = x - y |
*= | 先进行乘法运算,再将结果赋值给运算符左侧的变量 | x = y 等同于 x = x y |
/= | 先进行除法运算,再将结果赋值给运算符左侧的变量 | x /= y 等同于 x = x / y |
%= | 先进行取模运算,再将结果赋值给运算符左侧的变量 | x %= y 等同于 x = x % y |
# 3.3 字符串运算符
- 运算符表示将运算符左右两侧的字符串拼接到一起;
- += 运算符表示先将字符串进行拼接,然后再将结果赋值给运算符左侧的变量。
# 3.4 自增、自减运算符
运算符 | 描述 | 示例 |
---|---|---|
++x | 自增运算符 | 将 x 加 1,然后返回 x 的值 |
x++ | 自增运算符 | 返回 x 的值,然后再将 x 加 1 |
--x | 自减运算符 | 将 x 减 1,然后返回 x 的值 |
x-- | 自减运算符 | 返回 x 的值,然后将 x 减 1 |
# 3.5 比较运算符
运算符 | 描述 | 示例 |
---|---|---|
== | 等于 | x == y 表示如果 x 等于 y,则为真 |
=== | 全等 | x === y 表示如果 x 等于 y,并且 x 和 y 的类型也相同,则为真 |
!= | 不相等 | x != y 表示如果 x 不等于 y,则为真 |
!== | 不全等 | x !== y 表示如果 x 不等于 y,或者 x 和 y 的类型不同,则为真 |
< | 小于 | x < y 表示如果 x 小于 y,则为真 |
> | 大于 | x > y 表示如果 x 大于 y,则为真 |
>= | 大于或等于 | x >= y 表示如果 x 大于或等于 y,则为真 |
<= | 小于或等于 | x <= y 表示如果 x 小于或等于 y,则为真 |
# 3.6 逻辑运算符
运算符 | 描述 | 示例 |
---|---|---|
&& | 逻辑与 | x && y 表示如果 x 和 y 都为真,则为真 |
|| | 逻辑或 | x || y 表示如果 x 或 y 有一个为真,则为真 |
! | 逻辑非 | !x 表示如果 x 不为真,则为真 |
# 3.7 三元运算符
条件表达式 ? 表达式1 : 表达式2 ;
# 3.8 位运算符
运算符 | 描述 | 示例 |
---|---|---|
& | 按位与:如果对应的二进制位都为 1,则该二进制位为 1 | 5 & 1 等同于 0101 & 0001 结果为 0001,十进制结果为 1 |
| | 按位或:如果对应的二进制位有一个为 1,则该二进制位为 1 | 5 | 1 等同于 0101 | 0001 结果为 0101,十进制结果为 5 |
^ | 按位异或:如果对应的二进制位只有一个为 1,则该二进制位为 1 | 5 ^ 1 等同于 0101 ^ 0001 结果为 0100,十进制结果为 4 |
~ | 按位非:反转所有二进制位,即 1 转换为 0,0 转换为 1 | ~5 等同于 ~0101 结果为 1010,十进制结果为 -6 |
<< | 按位左移:将所有二进制位统一向左移动指定的位数,并在最右侧补 0 | 5 << 1 等同于 0101 << 1 结果为 1010,十进制结果为 10 |
>> | 按位右移(有符号右移):将所有二进制位统一向右移动指定的位数,并拷贝最左侧的位来填充左侧 | 5 >> 1 等同于 0101 >> 1 结果为 0010,十进制结果为 2 |
>>> | 按位右移零(无符号右移):将所有二进制位统一向右移动指定的位数,并在最左侧补 0 | 5 >>> 1 等同于 0101 >>> 1 结果为 0010,十进制结果为 2 |
# 3.8 优先级
# 4.操作符
# 5.注释
# 5.1 单行注释
// 这是第一种注释方式
/* 这是第二种注释方式 */
1
2
3
2
3
# 5.2 多行注释
/*
* 多行注释
* 多行注释
* 多行注释
*/
1
2
3
4
5
2
3
4
5
# 6.严格模式
# 7.代码块
代码块的目的是定义要一起执行的语句