ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Rust数据类型

Rust数据类型
  1. 整型
let a: i8 = 10;   //i: 有符号,8:占用长度
//let a = 10i8    //同上
//let a = 10_i8    //同上
let b: u64 = 99_999;    //u: 无符号, _ 作为可视分隔符以方便读数,等同于99999
let c: usize = 666;    //size: 根据系统架构确定,64位系统size=64,32位是32
  1. 浮点型
let a = 3.2    //默认f64
let b: f32 = 6.1
  1. 布尔型
let a = true
//let a: bool = false
  1. 字符型
let a = 'A'    //使用单引号,占4个字节
  1. 元组
let tup: (i32, f32, u8) = (-500, 3.8, 10);    //数据是复合类型, 可不声明类型
let (x, y, z) = tup;    //模式匹配法解构数据;
println!("元组数据的第一项是{}", x);
println!("元组数据的第一项是{}", tup.0);    //使用.号访问数据

没有任何值的()元组,称为单元类型,所有没有显示返回值的函数,都默认返回一个单元值()

  1. 数组
let a: [i32; 5] = [1,2,3,4,5];  //数据类型必须一致,且固定长度。类型申明可省略
let b = [3; 5];    //等同于,let b = [3, 3, 3, 3, 3]
let c = a[0]    //访问数组元素
//遍历数组
for i in a.iter() {println!("{}", i)
}

vector类型是动态数组、可变数组,若不确定用哪种数组,应该使用vector

  1. vextor(可变数组)
//创建数组
let v: Vec(i32) = Vec::new();
//let v = vec![1,2,3];    //初始化方式let first: i32 = &v[0];
println!("第一个元素是{}", first);
//let first = v.get(0);  //遍历数组并修改
let mut v2 = vec![2,4,5];
for i in &mut v2 {i += 10
}

get方式读取数组元素会返回Option<&T>,可以使用match解构返回结果,处理读取越界异常

  1. 字符串

字符串字面量是切片类型&str,表示堆空间中一段地址信息类型。String类型的引用类型也是&str,String类型有扩展方法,&str类型有切片类型的特性,如截取某一段。一个对象的引用要么是堆中的某个地址,要么是栈中的引用类型,如&str。

let s: &str =  "Hello every";
let s1 = String::from("Hi everyone");
let s2 = "Great!".to_string();
//s类型是&str,s1、s2类型是String
s1.push("!");    //String是可变长的,有push、push_str等增删插操作方法

&str是定长的,编译期就固定了,String类型是变长的,是运行期动态分配了内存空间,但当String类型变量出了作用域,Rust会自动调用drop方法来释放内存。

拼接字符串

let s1 = String::from("tic");
let s2 = String::from("tac");
let s3 = String::from("toe");let s = s1 + "-" + &s2 + "-" + &s3;   //s1被移出
let ss = format!({"{}-{}-{}"}, s1, s1, s3);    //都不会被移出

遍历字符串

let s = "HelloEveryone!";
for c in s.chars() {    //chars方法获取字符println!("{}", c);
}  
for b in s.bytes() {    //bytes方法获取字节码,UTF-8println!("{}", c);
} 
  1. 结构体
#[derive(Debug)]    //为打印输出显示标识
struct Person{name: String,age: u32,email: String,
}fn main() {let name = String::from("junmajinlong")let boy = Person {name,   //简写email: String::from("junmajinlong@xx.com"),age: 23,} println!("name: {}", user1.name);    //使用.访问字段let girl = Person {name: String::from("zhangqian"),..boy    //借用boy中的字段}println!("email: {}", boy.email);    //报错,boy.email被移动,变无效。若不报错使用..boy.clone()println!("{:?}", girl);    //或使用{:#?}进行调试输出
}
  • 元组结构体
struct Color(i32, i32, i32); 
let black = Color(0, 0, 0);
  • 类单元结构体
    是没有任何字段的空struct。

  • Struct方法

struct Rectangle{width: u32,height: u32,
}impl Rectangle {fn area(&self) -> u32 {self.width * self.height}
}
impl Rectangle {// 关联方法new:构造Rectangle的实例对象fn new(width: u32, height: u32) -> Rectangle {Rectangle { width, height }}
}fn main() {let rect1 = Rectangle{width: 30, height: 50};println!("面积是:{}", rect1.area());
}

关联函数是指第一个参数不是self(的各种形式)但和Struct有关联关系的函数。关联方法类似于其他语言中类方法或静态方法的概念。

  1. 枚举
enum IpAddrKind {V4,V6,
}
//使用::获取枚举值
let four = IpAddrKind::V4;
let six = IpAddrKind::V6;//内嵌多种类型的枚举
enum Message {Quit,Move { x: i32, y: i32 },Write(String),ChangeColor(i32, i32, i32),
}
  1. HashMap
use std::collections::HashMap;
//新建Map,并插入一条记录
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
//从数组插入数据
let teams  = vec![String::from("Blue"), String::from("Yellow")];
let initial_scores = vec![10, 50];//zip方法创建一个元组的vector,[("Blue", 10),(*,*)]
//collect方法将这个元组vector转换成一个HashMap
let scores: HashMap<_, _> = teams.iter().zip(initial_scores.iter()).collect();    //访问值
let team_name = "Blue".to_string();
let score = scores.get(&team_name);    //返回值是option<V>//更新
scores.insert(String::from("Blue"), 25);   //两次insert覆盖一个值//在键没有对应值时插入
let value = scores.entry(String::from("Yellow")).or_insert(50);
*value += 1;    //or_insert方法事实上会返回这个键的值的一个可变引用(&mut V),加*是解引用
返回列表