Rust 基本语法:数据类型、函数、注释、控制流

title: Rust 基本语法:数据类型、函数、注释、控制流date: 2021-04-25 00:26:42.203

数据类型

标量类型scalar-基本数据类型

复合类型compound-引用类型

整数类型

长度 有符号 无符号
8bit i8 u8
16bit i16 u16
32bit i32 u32
64bit i64 u64
arch isize usize

rust权威指南:以上除了位数的类型之外,还有isize和usize两种整数类型,他们的长度取决于程序运行的目标平台。在64位的架构上,它们就是64位的,在32位架构上,它们就是32位的。

Rust中的整数字面量

整数字面量 示例
Decimal 98_222
Hex 0xff
Octal 0o77
Binary Ob1111_0000
Byte(u8 only) b’A’

注意byte不能使用类型后缀

浮点数类型

f32 和 f64 ,默认推导出f64,因为它拥有更高的精度计算。

布尔类型

bool:true false

字符类型

char:描述当个字符

复合类型 compound type

元组和数组

  • 元组tuple:(姑且理解为不同类型元素的集合,python中也有)

    • 元组是一种常见的复合类型,他可以将其他不同类型的多个值组合进入一个复合类型中。
    • 元组还拥有一个固定的长度,无法在声明后增加或减少其中的元素数量。
    • 可以解构,解构赋值。
    • 可以通过点号运算符”.”来访问元组中的元素。
    • 字面量创建:let x:(i32,f64,u8)=(500,6.4,1);
  • 数组array:

    • 与元组不同,数组中的元素必须是相同的数据类型。
    • 一旦声明,内存空间不可变。
    • 字面量创建:let a =[1,2,3,4,5,6]; 或者let a:[i32,6]={1,2,3,4,5,6}
    • 还有一个动态数组:vector。后面会提到。

函数

函数fn function_name(){//code},fn + 函数名的方式,其中函数名rust规定使用蛇形命名法(snake case)作为命名规范,只能使用小写字母和下划线连接。

函数参数

在英语技术文档中,参数变量和传入的具体参数值自己分别对应的名称parameter和argument,但我们通常会混用两者并将它们统一地称为参数而不加以区分。

以上摘抄自Rust权威指南,但是我认为中文可以形参和实参加以区分。在函数签名中,也就是形参,我们必须显式声明每个参数的类型,这样子编译器就不需要通过上下文来推导出形参的数据类型,可以说是解耦,也可以说必须这样。

函数体中的语句和表达式

语句(statement)和表达式(expression)。

简单区分语句和表达式:

  • 有无返回值:语句无返回值,表达式有返回值。语句不能赋值给另外的变量,比如let x = ( let y = 6); 这是错的。在别的语言中存在x=y=6这样的语句使得x=6和y=6,但是它在rust是不可以的,道理也很简单,rust的开发者们肯定也不喜欢这种模糊不清的表达。
  • 表达式本身也是语句的一种。
  • 有些本来是表达式的一旦加了分好:就变成了语句,比如5是一个表达式,5;是一个语句。

函数的返回值

使用->后面声明它的类型。

1
2
3
fn five()->i32{
5
}

这个时候的5是一个表达式

1
2
3
fn five()->i32{
5;
}

这个5;是一个语句,这段代码是编译不能通过的,没有返回值,去掉分号才行。

注释

1
// hello world !

还有一种注释:文档注释。后面会提到

控制流

通过条件执行或重复执行,在其它语言中都有描述,这里不在赘述。Rust用来控制程序执行流的结构主要就是if表达式和循环表达式。

if表达式

1
2
3
if 表达式{
//执行的语句,表达式返回值必须是布尔类型
}

else if

else

if是一个表达式,有返回值

1
2
3
4
5
6
7
8
fn main(){
let condition =true ;
let number = if condition {
5
}else{
6
};
}

此时number能够获取返回值5。

Rust提供了三种循环:loop、while、for

loop
- 无条件循环,直到我们使用break语句,停止循环。
- loop有返回值(将需要返回的值写到break后面)。

1
2
3
4
5
6
7
8
9
fn main(){
let mut counter=0;
let result = loop{ //result的值为20
counter+=1;
if counter==10{
break counter*2;
}
}
}

while:条件循环

for:遍历集合更加方便安全
- 简单for循环的使用

1
2
3
4
5
6
fn main(){
let a= [10,20,30,40,50];
for element in a.iter(){
println("the value is:{}",element);
}
}

控制流的练习

  • 摄氏温度和华式温度的互相转换。
  • 生成一个n阶的斐波那契数列。