无题
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 | fn five()->i32{ |
这个时候的5是一个表达式
1 | fn five()->i32{ |
这个5;是一个语句,这段代码是编译不能通过的,没有返回值,去掉分号才行。
注释
1 | // hello world ! |
还有一种注释:文档注释。后面会提到
控制流
通过条件执行或重复执行,在其它语言中都有描述,这里不在赘述。Rust用来控制程序执行流的结构主要就是if表达式和循环表达式。
if表达式
1 | if 表达式{ |
else if
else
if是一个表达式,有返回值
1 | fn main(){ |
此时number能够获取返回值5。
Rust提供了三种循环:loop、while、for
loop
- 无条件循环,直到我们使用break语句,停止循环。
- loop有返回值(将需要返回的值写到break后面)。
1 | fn main(){ |
while:条件循环
for:遍历集合更加方便安全
- 简单for循环的使用
1 | fn main(){ |
控制流的练习
- 摄氏温度和华式温度的互相转换。
- 生成一个n阶的斐波那契数列。