变量
rust 中对于变量有三种类型: 临时量、可变值、常量。
let x = 4; // 临时值,不能修改,只能重新定义
x = 5; // error!
let x = 5; // success!
let mut x = 4; // 可变值,可以修改
x += 1; // success!
let mut x = 5; // error! ,不能重复定义可变值。
const x : uint32 = 4; // 常量,可以定义在全局或局部,必须是编译器能确定的值。
综合来看, 临时值类似于 c++ 的const 变量,可变值类似于c++的变量,常量类似于c++的 constexp 变量,但也有一些区别:
临时值允许重新定义,叫作
shadow的机制,可以用新定义覆盖掉前面的定义,重新定义时可以定义为不同的类型。
数据类型
Rust的数据类型分为两类: 标量和复合类型。一般开发语言都是如此。
标量包括: 整数、浮点数、bool类型、字符。没有字符串类型!
标量
整数
整数包括有符号整数和无符号整数,类型用 i和u 加上位数表示,特别的 isize和usize表示架构类型,在32位系统中,表示i32 和u32,在64位系统中表示i64 和u64。
![![05 学习笔记/rust/03 语法规则/#^Table]]Rust 的整数有意思的地方在于写字面值时,可以在中间加 _,比如 1_000 和 1000 是一样的。
需要注意的是对于整数溢出,如果是debug时,程序会直接调用panic! 进行中断,当release时,程序会根据位数进行截断,比如255+1==0
浮点数
浮点数只有两种: f32和f64 分别表示单精度和双精度小数,Rust 默认使用 f64。
注意: 没有
fsize类型!
bool
布尔型有 true 和false 两个值,没什么好说的。
字符
字符类型是 char类型,是unicode 类型,可以表示unicode 字符集。
数学运算
Rust 支持加减乘除、求余等基础运算。这里没有介绍运算时的单位转换。
复合类型
主要有两种复合类型: tuple 和array 。这两种类型都是简单复合类型
tuple
(x, y) ,括号表示,可以使用不同类型,与f# 的 tuple 比较像。
let tu = (2, 3, 4, 5);
let tu: (u32, i32, char, bool) = (1, 2, 'x', true);
let x = tu.0;
let y = tu.1;
let (x, y, z, p) = tu;
array
array 类型类似于 c++ 的静态数组,必须长度确定,使用[] 来表示,类型必须相同。复杂应用推荐使用标准库中的vector 。
函数
函数以 fn 标识,参数形式为 (value:type, value2, type2),类似于python 等,返回值使用-> type 标识,类似于c++的后置返回声明。
重点来了:语句和表达式。
在Rust 中一个很重要的概念是表达式。有返回值的是表达式,没有返回值的是语句。表达式不能以; 结尾。
表达式举例:
let x = 5; // 5是个表达式, let x = 5; 是一条语句
// 下面语句中, {} 中的部分是表达式,最后y+1 后面不能跟`;`
let x = {
let y = 2;
y + 1
}
函数的返回值也是同样的,直接放在最后一句,不跟; 即可。也可以用return ,但比较少。
fn test_return() -> u32
{
5
}
fn main()
{
let x = test_return();
}
注释
Rust 使用// 进行单行注释。
没有其他可说的,没有/* */ 形式。
控制流
if
if没什么好说的,条件不需要加括号,不支持自动转换为bool。可以作为表达式使用, 可以使用else if 作为分支。
let x = 5;
let y = if x > 5 {2} else {3};
loop
基础循环,类似于 while true,区别在于可以加标签,可以直接退出多层循环,可以通过 break value 在退出循环时返回值。
'xxloop: loop {
'yyloop': loop {
break 'xxloop'; // 直接退出上层循环
}
}
let mut y = 0;
let x = loop {
y += 10;
if (y > 50){
break y *2; // 返回 y*2 给 x
}
}
while
while cond
for
for x in array
作业
1. 转换温度,在华氏度和摄氏度之间转换
// 转换为华氏温度
fn ConvertToFahrenheit(temp: f64) -> f64{
temp * 9.0 / 5.0 + 32.0
}
// 从华氏温度转换为摄氏度
fn ConvertFromFahrenheit(temp: f64) -> f64 {
(temp - 32.0) * 5.0 / 9.0
}
2. nth Fibonacci number
// fibonacci number
fn fib(n: usize) -> usize{
if n < 2
{
1
}
else
{
fib(n - 1) + fib(n - 2)
}
}