# 一.语法

前言

主要由关键字标识符操作符组合成一条语句,在对应的环境执行这些语句得到最终结果

# 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
  • 3.重新赋值

    变量赋值前提是此变量为可变变量,用关键字mut标识,未标识的为不可变变量不能赋值

let mut a = 1;
a = 456;
1
2
  • 4.重新绑定
let a = 123;   // 可以编译,但可能有警告,因为该变量没有被使用
let a = 456;
1
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.3 函数体

函数体由一系列可以以表达式(Expression)结尾的语句(Statement)组成

# 2.3.4 返回值

在参数声明之后用 -> 来声明函数返回值的类型

函数体中,随时都可以以 return 关键字结束函数运行并返回一个类型合适的值

fn add(a: i32, b: i32) -> i32 {
    return a + b;
}
1
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

# 5.2 多行注释

/*
 * 多行注释
 * 多行注释
 * 多行注释
 */
1
2
3
4
5

# 6.严格模式

# 7.代码块

代码块的目的是定义要一起执行的语句