开胃菜:用Rust编写n阶斐波那契数列:
fn fiber(n:i32)->i32{
if n <=1 {
1
}else{
fiber(n-1) + fiber(n-2)
}
}
Rust函数的返回值,不用添加return关键字,就可以实现。还是很有趣的!!!
循环:
有三种循环:for、while和loop
1. for循环:
a. 对数组a进行for循环:
for element in a.iter() {
}
b. 对Range进行for循环:
for number in (1..4).rev() {
println!("{}!", number);
}
for循环好处是不受数据结构元素长度的限制。for循环的安全性和简捷性使它成为了Rust中最为常用的循环结构。
2. while循环:
while index < 5 {
}
相比loop循环使用if、else及break来完成整个循环,while已经很简洁了。
3. loop循环:
let result = loop {
counter += 1;
if counter == 10 {
break counter * 2;
}
};
break关键字返回counter * 2,将循环的返回结果赋值给result。
条件判断:
if 条件与类型转换:
Rust不会自动尝试将非布尔类型的值转换为布尔类型
let number = 3;
if number { // 这里是错误的,需要改成numbe != 0
println!("number was three");
}
if 表达式:
let number = if condition {
5
} else {
"six"
};
强大的分支结构语法match:(待补充)
注释:
1. 两道斜杠
在Rust中,注释必须使用两道斜杠开始,并持续到本行结尾
2.文档注释的注释格式(待补充)
函数:
1. 函数返回类型:
a. 函数返回类型使用->
b. 使用return提前返回,或者使用隐式返回表达式
fn five() -> i32 {
5
}
c. 函数默认返回值是空元组()
2. 函数中的表达式和指令:
语句指那些执行操作但不返回值的指令,而表达式则是指会进行计算并产生一个值作为结果的指令
let y = {
let x = 3;
x + 1
};
x+1是表达式,可以作为结果返回
数据类型:
Rust内置两种复合数据类型:元祖和数组。
1. 数组:
数组中的每一个元素都必须是相同的类型。Rust中的数组拥有固定的长度,一旦声明就再也不能随意更改大小。
数组的类型定义:let a: [i32; 5] = [1, 2, 3, 4, 5];
创建一个含有相同元素的数组:let a = [3; 5];
非法的数组元素访问:索引超出了当前数组的长度,Rust就会发生panic。第一个涉及Rust安全原则。
2. Rust标准库也提供了一个更加灵活的动态数组(vector):(待补充)‘’
3. 元组:
元祖可以将其他不同类型的多个值组合进一个复合类型中。元组还拥有一个固定的长度:你无法在声明结束后增加或减少其中的元素数量。
元祖解构:
let tup = (500, 6.4, 1);
let (x, y, z) = tup;
标量类型:
Rust中内建了4种基础的标量类型:整数、浮点数、布尔值及字符
整数类型:
1. 符号整数类型的名称会以i开头,无符号整数以u开头
2. arch是根据平台架构相关的整数类型通常是指isize
和usize。
在32位系统上,isize
是32位(4字节);在64位系统上,则是64位(8字节);usize
是一个无符号的整数类型,与isize
相似,它的大小也是根据平台来定,用于与指针大小相匹配的无符号算术操作。它常用于集合的长度、数组索引等场景,当确定索引值永远为非负时。
3. 对于一个位数为n 的有符号整数类型,它可以存储从-(2^ (n -1) )到2 ^(n -1)-1范围内的所有整数;无符号整数类型而言,则可以存储从0到2 n -1范围内的所有整数
4.书写整数字面量
除了Byte,其余所有的字面量都可以使用类型后缀,比如57u8,代表一个使用了u8类型的整数57。同时你也可以使用_作为分隔符以方便读数,比如1_000
5. 整数溢出:
编译时使用了带有--release标记的发布(release)模式,那么Rust就不会包含那些可能会触发panic的检查代码。作为替代,Rust会在溢出发生时执行二进制补码环绕。简而言之,任何超出
类型最大值的数值都会被“环绕”为类型最小值以u8为例,256会变为0,257会变为1
在调试(debug)模式下进行编译,那么Rust就会在程序中包含整数溢出的
运行时检测代码,并在整数溢出发生时触发程序的panic
浮点数:
两种类型是f32和f64。在现代CPU中f64与f32的运行效率相差无几,却拥有更高的精度,
所以在Rust中,默认会将浮点数字面量的类型推导为f64。
对于所有的数值类型,Rust都支持常见的数学运算:加法、减法、乘法、除法及取余
布尔类型:
字符类型:
在Rust中,char类型被用于描述语言中最基础的单个字符。char类型使用单引号指定,而不同于字符串使用双引号指定。
Rust中的char类型占4字节,是一个Unicode标量值。emoji表情都可以作为一个有效的char类型值
常亮与变量:
变量:
Rust中的变量默认是不可变的。为了能够让你安全且方便地写出复杂、甚至是并行的代
码。过在声明的变量名称前添加mut关键字来使其可变。mut还会向阅读代码的人暗示其他代码
可能会改变这个变量的值
常亮:
常量不仅是默认不可变的,它还总是不可变的。
常量可以被声明在任何作用域中,甚至包括全局作用域
在Rust程序中,我们约定俗成地使用以下画线分隔的全大写字母来命名一个常量:
const MAX_POINTS: u32 = 100_000;
变量隐藏(shadow):
let x = 5;
let x = x + 1;
let x = x * 2;
通过使用let,我们可以对这个值执行一系列的变换操作,并允许这个变量在操作完成后保持自己的不可变性。
隐藏机制与mut的另一个区别在于:由于重复使用let关键字会创建出新的变量,所以我们可以在复用变量名称的同时改变它的类型。