RUST 基础类型

首先rust语言是静态类型,意味着在编译阶段必须明确显示数据类型

rust数据类型分为两大类:

标量类型

整型、浮点型、布尔类型和字符类型

整型表示: 每一个变体都可以是有符号或无符号的 u 无符号 i有符号

fn num (){
let a : u64 = 30;
let a :usize = 20;
}

浮点数表述:

fn float_add (){
let a = 3.14; //默认64 双精度表示
let y: f32 = 3.0; // f32
println!(“{}”,a + y);
}

布尔类型:

fn main() {
let t = true;

let f: bool = false; // 显式指定类型注解

}

字符类型: 注意 char 由单引号指定,不同于字符串使用双引号

fn main() {
let c = ‘z’;
let z = ‘ℤ’;
let heart_eyed_cat = ‘😻’;
}

复合类型

复合类型(Compound types)可以将多个值组合成一个类型。Rust 有两个原生的复合类型:元组(tuple)和数组(array

  • tuple 类似于js的对象

fn main() {
let tup = (500, 6.4, 1);

let (x, y, z) = tup;

println!("The value of y is: {}", y);

}

fn main() {
let x: (i32, f64, u8) = (500, 6.4, 1); // 前面是类型声明

let five_hundred = x.0;

let six_point_four = x.1;

let one = x.2;

}

  • array

rust 的数组跟其他语言的数组不一样在于:

1 首先声明数组有两种方案,这两种方法实现方法截然不同

一种是普通的 let a =[1,,3,4,5]; 这种不能修改数组的长度
一种是vector 这个可以操作数据的大小

2 无效数组会直接报错警告,不会出现无效数组继续操作内存

3 针对不能修改数组长度的数组使用场景比如: 年份这种。一年就十二个月

4 数组就可以用过索引直接访问

比如:

let arr: [&str; 5] = [“a”,”b”,”c”,”d”,”e”];

println!(“The value of element is: {}”, arr[0]);

let a: [i32; 5] = [1, 2, 3, 4, 5]; 这个写法是不是很爽?;类型一样的时候

let arr: [&str; 5] = [“a”,”b”,”c”,”d”,”e”];

fn main() {
let a = [1, 2, 3, 4, 5];
}

比如这段代码:

fn main() {
let a = [1, 2, 3, 4, 5];
let index = 10;

let element = a[index];

println!("The value of element is: {}", element);

}

使用 cargo run 运行代码后会产生如下结果:

$ cargo run
Compiling arrays v0.1.0 (file:///projects/arrays)
Finished dev [unoptimized + debuginfo] target(s) in 0.31 secs
Running target/debug/arrays
thread ‘main’ panicked at ‘index out of bounds: the len is 5 but the index is
10’, src/main.rs:5:19
note: Run with RUST_BACKTRACE=1 for a backtrace.

编译并没有产生任何错误,不过程序会出现一个 运行时(runtime)错误并且不会成功退出。当尝试用索引访问一个元素时,Rust 会检查指定的索引是否小于数组的长度。如果索引超出了数组长度,Rust 会 panic,这是 Rust 术语,它用于程序因为错误而退出的情况。

这是第一个在实战中遇到的 Rust 安全原则的例子。在很多底层语言中,并没有进行这类检查,这样当提供了一个不正确的索引时,就会访问无效的内存。通过立即退出而不是允许内存访问并继续执行,Rust 让你避开此类错误。