ToB企服应用市场:ToB评测及商务社交产业平台
标题:
Rust常见编程概念
[打印本页]
作者:
守听
时间:
2024-3-21 10:08
标题:
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)
语言,编译时就必须知道所有变量的类型。
根据值及其使用方式,编译器通常可以推断出我们想要用的类型:
当多种类型均有可能时必须增加类型注解,例如:
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
类型是语言中最原生的字母类型:
[code]fn main() { //单引号声明 char 字面量,双引号声明字符串字面量 let c = 'z'; let z: char = 'ℤ'; let heart_eyed_cat = '
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4