通用编程概念
变量与可变性
变量默认不可变,一旦被绑定到某个值,就不再被改变了。也就是以下操作是非法的
let x = 5;
x = 6;
通过在声明时添加关键词mut
,将变量变成可变的let mut x = 5;
常量
使用const
来声明常量,const MAX:u32 = 100
- 不能使用
mut
来修饰常量 - 常量可以被声明在任何作用域
- 常量只能绑定到常量表达式上。而类似函数的返回值这样需要在运行时进行计算的值不能被绑定到常量上
- 常量必须显式的指定类型
隐藏
新声明的变量可以覆盖掉旧的同名变量
let x = 0;
let x = x+1;
隐藏机制与mut
的区别在于
- 每次覆盖时都是新创建一个变量
- 由于只是复用名称,所以可以改变类型
数据类型
Rust是静态类型语言,大部分情况下编译器可以自动推导变量类型,某些时候需要我们手动添加类型
‘
标量类型
整数类型
有i8~i32,u8~u32
,分别对应8~32
位的有符号、无符号整数,对于整数字面量,默认推导是i32
。顺便一提在整数字面量中可以使用_
作为分隔符方便阅读,如10_000
浮点数类型
有f32,f64
,由于效率相差无几,但f64
有更高精度,所以浮点数字面量都是默认推导f32
布尔类型
bool
只有两个值,true
和false
,仅占一个字节大小
字符类型
char
,占4字节,是一个unicode标量值。其字面量是用单引号括起来的
复合类型
元组
元组有固定长度,声明一个元组由下所示
let tup:(i32,f64,u8) = (500,6.4,1);
取一个元组中的值可以通过:
- 通过模式匹配来解构元组:
let (x,y,z) = tup;
,这意味着x
对应500
,依顺序类推 - 通过
.索引
来访问,tup.0,tup.1,tup.2
就对应着500,6.4,1
数组
数组拥有固定长度,且内部元素也是同一类型
数组的类型声明是[元素类型;数组大小]
let a: [i32:5] = [1,2,3,4,5];
可以方便的创建具有相同元素的数组,使用[元素;元素个数]
let a = [3;5]
当问数组元素,使用a[i]
,这个与所有语言都是一样的
函数
基本的声明方式
fn 函数(参数列表) -> 返回值类型 {
函数体
}
语句和表达式
- 语句是指执行操作但是不返回值的指令,比如
let y = 6;
- 表达式是指那些进行计算,并返回一个值作为结果的指令。比如函数的调用,比如
5+6
再比如
let y = {
let x= 3;
x+1
}
在大括号括起来的这段代码块中,最后没有加上;
,此时会将x+1
的结果4返回,作为这个代码块的返回值,绑定到y
上
函数返回值
可以显式的使用return
fn square(x:i32) -> i32 {
return x*x;
}
可以根据我们上面的讨论,以一个表达式作为函数定义体的结尾,表示返回该表达式的值
fn square(x:i32) -> i32 {
x*x
}
控制流
if表达式
与其它语言没有任何不同
if number%4==0 {
...
} else if number %3 == 0{
...
}else {
...
}
在let中使用if
let number = if condition {
5
}else {
6
};
有点像三目运算符:?
循环
loop循环
loop循环是一值进行循环,直到我们使用break
显式的退出
loop {
干一些事;
if 某个条件 {
break; //退出循环
}
}
从 loop循环中返回值
像使用return
一样使用break
let mut counter = 0;
let result = loop {
counter += 1;
if counter == 10 {
break count*2;
}
};
将要返回的表达式写在break后面
while循环
while 条件 {
}
和其他语言美与任何区别
for循环
像是python那样使用for循环
let a = [1,2,3,4,5];
for i in a.iter() {
println!("the value is:{}",i);
}