【Rust】类型,函数,控制,所有权


【Rust】类型,函数,控制,所有权

整类型

长度     有符号   无符号
8-bit    i8      u8
16-bit   i16     u16
32-bit   i32     u32
64-bit   i64     u64
128-bit  i128    u128
arch     isize   usize
let vi8 : i8 = 1;
let vu8 : u8 = 1;
let vi16 : i16 = 1;
let vu16 : u16 = 1;
let vi32 : i32 = 1;
let vu32 : u32 = 1;
let vi64 : i64 = 1;
let vu64 : u64 = 1;
let vi128 : i128 = 1;
let vu128 : u128 = 1;
let vi : isize = 1;
let vu : usize = 1;

浮点类型

长度      符号
32-bit    f32
64-bit    f64
let a : f32 = -1.1;
let b : f32 = 1.1;
let c : f64 = -2.2;
let d : f64 = 2.2;

布尔类型

bool true false

let flag = true;

字符类型

字符四个字节 unicode

let a = 'a';

元组类型

元组是一个将多个其他类型的值组合进一个复合类型的主要方式。元组长度固定:一旦声明,其长度不会增大或缩小。
我们使用包含在圆括号中的逗号分隔的值列表来创建一个元组。元组中的每一个位置都有一个类型,而且这些不同值的类型也不必是相同的

let tup: (i32, f64, u8) = (500, 6.4, 1);
let (a,b,c) = tup;// 解构值 a=500,b=6.4,c=1
let x = tup.0;// 索引值 x=500
let y = tup.1;
let x = tup.2;

数组类型

长度是固定的,分配在栈上

let a = [1,2,3,4,5];// 没有指定类型和长度,由初始值决定
let b: [u32;5] = [6,7,8,9,0];// 指定类型和长度
let c = ['c';3];// 设置相同的值,相当于['c','c','c']
let d = b[0];//获取数组值

函数

// 没有返回值
fn show(v: u32) {
    println!("{}",v);
}
// retur 返回 u32
fn sum1(a: u32, b: u32) -> u32 {
    return a + b;
}
// 最末尾表达式返回,不能加分号,因为加了分号会使表达式变为语句而报错
fn sum2(a: u32, b: u32) -> u32 {
    a + b
}

注释

//

控制

if

let num: u32 = 10;
// 没有括号
if 5 > num && num > 0 { } else if 10 > num && num > 5 { } else if num % 4 == 0 { } else { }

loop

let mut num: u32 = 0;
// 使用break终止循环,使用continue继续循环
loop {
    num += 1;
    if num % 2 == 0 {
        continue;
    }
    if num > 10 {
        break;
    }
    println!("{}",num);
}
// 使用break终止循环并返回值
let result = loop {
    if num > 10 {
        break 999; // 返回值
    }
};// 分号不能少,这是语句
println!("{}",result);

while

let mut sum: u32 = 0;
let mut index: u32 = 1;
while index <= 100 {
    sum += index;
    index += 1;
}
println!("{}",sum);

for

let a = [10,20,30,40,50];
for item in a.iter() {
    println!("{}",item);
}
for item in 0..4 {
    println!("{}",item);// 结果0,1,2,3
}
for item in (0..4).rev() {
    println!("{}",item);// 结果3,2,1,0
}

所有权

所有权的规则
Rust 中的每一个值都有一个被称为其 所有者(owner)的变量。
值在任一时刻有且只有一个所有者。
当所有者(变量)离开作用域,这个值将被丢弃。

Rust 采取了一个不同的策略:内存在拥有它的变量离开作用域后就被自动释放

变量与数据交互

方式(一):移动

let s1 = String::from("hello");
let s2 = s1;
// s1 不能再用

方式(二):克隆

let s1 = String::from("hello");
let s2 = s1.clone();
// s1,s2都可用

栈上的数据:复制
实现了Copy trait 整数、布尔、浮点、字符、元组

向函数传递值可能会移动或复制,移动时所有权会转移,复制不会转移
返回值也可以转移所有权

let mut s1 = String::from("hello");
s1 = take(s1);// 转移所有权到函数
println!("{}",s1);

fn take(s: String) -> String {
    s// 返回所有权
}