Rust 操作符
Rust 提供了一系列操作符(operators),每种操作符都有特定的功能和应用场景。
1. 算术操作符
这些操作符用于基本的数学运算:
+
: 加法,用于两个数相加。- 示例:
let sum = 5 + 10;
- 示例:
-
: 减法,用于两个数相减。- 示例:
let difference = 10 - 5;
- 示例:
*
: 乘法,用于两个数相乘。- 示例:
let product = 4 * 3;
- 示例:
/
: 除法,用于两个数相除。- 示例:
let quotient = 10 / 2;
- 示例:
%
: 取余,用于计算两个数的余数。- 示例:
let remainder = 10 % 3;
- 示例:
2. 比较操作符
这些操作符用于比较两个值,返回一个布尔值:
==
: 相等,用于判断两个值是否相等。- 示例:
let is_equal = 5 == 5;
- 示例:
!=
: 不相等,用于判断两个值是否不相等。- 示例:
let is_not_equal = 5 != 6;
- 示例:
>
: 大于,用于判断左边的值是否大于右边的值。- 示例:
let is_greater = 10 > 5;
- 示例:
<
: 小于,用于判断左边的值是否小于右边的值。- 示例:
let is_less = 5 < 10;
- 示例:
>=
: 大于或等于,用于判断左边的值是否大于或等于右边的值。- 示例:
let is_greater_or_equal = 10 >= 10;
- 示例:
<=
: 小于或等于,用于判断左边的值是否小于或等于右边的值。- 示例:
let is_less_or_equal = 5 <= 10;
- 示例:
3. 逻辑操作符
这些操作符用于逻辑运算,通常与布尔值结合使用:
&&
: 逻辑与,用于判断两个布尔表达式是否都为true
。- 示例:
let and_result = true && false;
- 示例:
||
: 逻辑或,用于判断两个布尔表达式是否至少一个为true
。- 示例:
let or_result = true || false;
- 示例:
!
: 逻辑非,用于取反一个布尔表达式。- 示例:
let not_result = !true;
- 示例:
4. 赋值操作符
这些操作符用于将值赋给变量:
=
: 赋值,将右边的值赋给左边的变量。- 示例:
let x = 5;
- 示例:
+=
: 加赋值,将右边的值加到左边的变量上。- 示例:
let mut x = 5; x += 10;
- 示例:
-=
: 减赋值,将右边的值从左边的变量中减去。- 示例:
let mut x = 10; x -= 5;
- 示例:
*=
: 乘赋值,将右边的值乘以左边的变量。- 示例:
let mut x = 2; x *= 3;
- 示例:
/=
: 除赋值,将左边的变量除以右边的值。- 示例:
let mut x = 10; x /= 2;
- 示例:
%=
: 模赋值,将左边的变量取模右边的值。- 示例:
let mut x = 10; x %= 3;
- 示例:
5. 位操作符
这些操作符用于对位进行操作,通常用于底层编程或特定算法实现:
&
: 按位与,对两个整数的对应位都为 1 时结果为 1。- 示例:
let and = 5 & 3; // 结果为 1
- 示例:
|
: 按位或,对两个整数的对应位有一个为 1 时结果为 1。- 示例:
let or = 5 | 3; // 结果为 7
- 示例:
^
: 按位异或,对两个整数的对应位不同则结果为 1。- 示例:
let xor = 5 ^ 3; // 结果为 6
- 示例:
!
: 按位非,对整数的每一位取反。- 示例:
let not = !0b0001_0010; // 结果为 0b1110_1101
- 示例:
<<
: 左移,将位向左移动指定的位数(右边补零)。- 示例:
let left_shift = 1 << 3; // 结果为 8
- 示例:
>>
: 右移,将位向右移动指定的位数(左边补符号位或补零)。- 示例:
let right_shift = 8 >> 3; // 结果为 1
- 示例:
6. 范围操作符
范围操作符用于生成数值范围:
..
: 半开区间,从起始值到结束值(不包括结束值)。- 示例:
for i in 0..5 { println!("{}", i); } // 输出 0 到 4
- 示例:
..=
: 闭区间,从起始值到结束值(包括结束值)。- 示例:
for i in 0..=5 { println!("{}", i); } // 输出 0 到 5
- 示例:
..
(单侧范围): 生成从起始值到某个值或从某个值到结束值的范围。- 示例:
let r = 3..; // 从 3 到无穷大
let r = ..3; // 从负无穷大到 3
- 示例:
7. 引用与解引用操作符
这些操作符用于处理指针和引用:
&
: 引用操作符,创建一个引用(即指向某个值的指针)。- 示例:
let x = 5; let y = &x;
- 示例:
*
: 解引用操作符,解引用一个指针或引用,获取其指向的值。- 示例:
let x = 5; let y = &x; let z = *y;
- 示例:
8. 其他操作符
.
: 成员访问或方法调用。- 示例:
let len = vec.len();
- 示例:
..
: 结构体更新语法或元组解构。- 示例:
let updated = Person { age: 30, ..person };
- 示例:
[]
: 索引操作符,用于访问数组、切片、向量等的元素。- 示例:
let first = arr[0];
- 示例:
()
: 调用函数或方法,或用于将表达式分组。- 示例:
let result = add(5, 3);
- 示例:
?
: 错误传播操作符,用于传播Result
或Option
类型的错误。- 示例:
let value = some_function()?;
- 示例:
::
: 访问路径操作符- 在模块系统中,用于访问模块中的项目(如函数、常量、类型)。
- 用于调用结构体、枚举的关联函数或静态方法。
- 从一个模块或包中访问另一个模块或包的项目。
- 示例:
mod math {
pub const PI: f64 = 3.14159;
pub fn add(a: i32, b: i32) -> i32 {
a + b
}
}
fn main() {
let pi = math::PI;
let sum = math::add(5, 10);
let origin = Point::origin();
let color = Color::Red;
}
struct Point {
x: i32,
y: i32,
}
impl Point {
pub fn origin() -> Self {
Point { x: 0, y: 0 }
}
}
enum Color {
Red,
Green,
Blue,
}
as
: 转换操作符:用于类型转换,将一个值转换为另一种类型。- 示例:
let x = 5;
let y = x as f64; // 将 i32 转换为 f64
_
: 占位符:- 在模式匹配中表示通配符,忽略某个值;或者在类型推断中使用表示不关心的类型。
- 示例:
let tuple = (1, 2, 3);
let (_, y, _) = tuple;
let v: Vec<_> = (0..10).collect();
|
: 模式匹配中的或操作符:- 在模式匹配中表示多种模式的组合,即如果任何一种模式匹配,则匹配成功。
- 示例:
let x = 1;
match x {
1 | 2 => println!("One or two"), // 如果 x 是 1 或 2,都会匹配
_ => println!("Other"),
}
总结
Rust 提供了丰富的操作符,以便开发者在不同的编程场景下使用。每个操作符都有其特定的功能和适用场景,理解它们的用法有助于编写更加高效和清晰的 Rust 代码。