Rust常见编程概念
目录[*]变量和可变性
[*]常量
[*]隐藏
[*]数据类型
[*]标量类型
[*]整型
[*]浮点型
[*]布尔型
[*]字符类型
[*]复合类型
[*]元组类型
[*]数组类型
[*]访问数组元素
[*]无效的数组元素访问
[*]函数
[*]参数
[*]语句和表达式
[*]具有返回值的函数
[*]注释
[*]控制流
[*]if 表达式
[*]使用 else if 处理多重条件
[*]在 let 语句中使用 if
[*]使用循环重复执行
[*]使用 loop 重复执行代码
[*]从循环返回值
[*]循环标签:在多个循环之间消除歧义
[*]while 条件循环
[*]使用 for 遍历集合
本文大部分内容来自官方文档,对于一些基础常识的内容做了删减,适合已经掌握其它编程语言的人查阅,原文档内容参考常见编程概念
。
变量和可变性
变量默认是不可变的,可以在变量名前添加 mut 来使其可变。
示例代码:
fn main() {
//let x = 5; 默认不可变,编译报错
let mut x = 5;
println!("The value of x is: {x}");
x = 6;
println!("The value of x is: {x}");
}常量
类似于不可变变量,常量 (constants)是绑定到一个名称的不允许改变的值,常量与变量的区别:
[*]不允许对常量使用 mut,常量不光默认不可变,它总是不可变。
[*]声明常量使用 const 关键字而不是 let,并且必须注明值的类型。
[*]常量可以在任何作用域中声明,包括全局作用域。
[*]常量只能被设置为常量表达式,而不可以是其他任何只能在运行时计算出的值。
示例代码:
const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;Rust 对常量的命名约定是在单词之间使用全大写加下划线,编译器能够在编译时计算一组有限的操作。
在声明它的作用域之中,常量在整个程序生命周期中都有效,将硬编码值声明为常量有助于后期代码维护。
隐藏
可以用相同变量名称来隐藏一个变量,以及重复使用 let 关键字来多次隐藏,如下所示:
fn main() {
//将 x 绑定到值 5 上
let x = 5;
//创建了一个新变量 x
let x = x + 1;
{
//创建了一个新变量 x
let x = x * 2;
println!("The value of x in the inner scope is: {x}");
//输出 The value of x in the inner scope is: 12
}
println!("The value of x is: {x}");
//输出 The value of x is: 6
}隐藏与将变量标记为 mut 是有区别的:
[*]对变量重新赋值时不使用 let 关键字会导致编译时错误,通过使用 let 可以用这个值进行一些计算,计算完之后变量仍然是不可变的。
[*]当再次使用 let 时,实际上创建了一个新变量,我们可以改变值的类型,并且复用这个名字,例如:
//字符串类型
let spaces = " ";
//数字类型
let spaces = spaces.len();隐藏使我们不必使用不同的名字,如 spaces_str 和 spaces_num。
下面这种代码会报错,不能改变变量的类型:
let mut spaces = " ";
spaces = spaces.len();注:不要滥用隐藏特性,被隐藏变量和新变量尽量处于同一个作用域。
数据类型
每一个值都属于某一个 数据类型(data type),有两类数据类型子集:标量(scalar)和复合(compound)。
Rust 是 静态类型(statically typed)语言,编译时就必须知道所有变量的类型。
根据值及其使用方式,编译器通常可以推断出我们想要用的类型:
https://img2024.cnblogs.com/blog/1495663/202401/1495663-20240105111615899-1678219859.png
当多种类型均有可能时必须增加类型注解,例如:
let guess: u32 = "42".parse().expect("Not a number!");标量类型
标量(scalar)类型代表一个单独的值,Rust 有四种基本的标量类型:整型、浮点型、布尔类型和字符类型。
整型
整数 是一个没有小数部分的数字,Rust 内建的整数类型如下:
长度有符号无符号8-biti8u816-biti16u1632-biti32u3264-biti64u64128-biti128u128archisizeusize可以使用其中的任一个来声明一个整数值的类型,类型取值范围如下(n 是变体使用的位数):
[*]有符号的变体可以储存包含从 -(2ⁿ⁻¹) 到 2ⁿ⁻¹ - 1 的数字,如 i8 可以储存从 -(2⁷) 到 2⁷ - 1 的数字,也就是从 -128 到 127。
[*]无符号的变体可以储存从 0 到 2ⁿ - 1 的数字,如 u8 可以储存从 0 到 2⁸ - 1 的数字,也就是从 0 到 255。
[*]isize 和 usize 类型依赖运行程序的计算机架构:64 位架构上它们是 64 位的,32 位架构上它们是 32 位的。
可以使用下表中的任何一种形式编写数字字面值:
数字字面值例子Decimal (十进制)98_222Hex (十六进制)0xffOctal (八进制)0o77Binary (二进制)0b1111_0000Byte (单字节字符)(仅限于u8)b'A'
[*]可以是多种数字类型的数字字面值允许使用类型后缀,例如 57u8 来指定类型;
[*]允许使用 _ 做为分隔符以方便读数,例如1_000 的值与 1000 相同。
如果不知道使用哪种类型的数字,可以使用 Rust 的默认类型,数字类型默认是 i32,isize 或 usize 主要作为某些集合的索引。
关于整型溢出的处理:
[*]当在 debug 模式编译时,Rust 检查这类问题并使程序 panic,这个术语被 Rust 用来表明程序因错误而退出。
[*]使用 --release flag 在 release 模式中构建时,Rust 不会检测会导致 panic 的整型溢出。发生整型溢出时会进行二进制补码操作,值 256 变成 0,值 257 变成 1,依此类推。
为了显式地处理溢出的可能性,可以使用这几类标准库提供的原始数字类型方法:
[*]所有模式下都可以使用 wrapping_* 方法进行 wrapping,如 wrapping_add
[*]如果 checked_* 方法出现溢出,则返回 None值
[*]用 overflowing_* 方法返回值和一个布尔值,表示是否出现溢出
[*]用 saturating_* 方法在值的最小值或最大值处进行饱和处理
浮点型
Rust 也有两个原生的 浮点数(floating-point numbers)类型,分别是 f32 和 f64,分别占 32 位和 64 位,默认类型是 f64:
fn main() {
let x = 2.0; // f64
let y: f32 = 3.0; // f32
}浮点数采用 IEEE-754 标准表示,f32 是单精度浮点数,f64 是双精度浮点数。
注:Rust 中的所有数字类型都支持基本数学运算:加法、减法、乘法、除法和取余,整数除法会向零舍入到最接近的整数。
布尔型
Rust 中的布尔类型有两个可能的值:true 和 false,使用 bool 表示:
fn main() {
let t = true;
let f: bool = false;
}字符类型
Rust 的 char 类型是语言中最原生的字母类型:
fn main() { //单引号声明 char 字面量,双引号声明字符串字面量 let c = 'z'; let z: char = 'ℤ'; let heart_eyed_cat = '
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]