rust的变量和数据类型 - 前端笔记-一,变量,可变变量,常量 fn main() { println!(Hello, world!); // 变量 ...

学习笔记

点滴记忆
回忆过往
首页>> web后端 >>rust的变量和数据类型 - 前端笔记
一,变量,可变变量,常量
fn main() {
    println!("Hello, world!");

    // 变量
    let x = 1;
    let y: i32 = 16;
    println!("{}--{}", x, y);

    // 可变变量
    // let  rust = "rust";
    // rust = "dome"; //报错

    let mut longInt: i32 = 100;
    longInt = 10;
    println!("{}", longInt);

    // 变量遮掩---可定义上面出现过的变量名,且上面的变量无法

    let longInt: String = String::from("张三");
    println!("{}", longInt);

    // 常量

    const MAX: u32 = 1024;
    println!("{}", MAX)
}


二,基本数据类型
fn main() {

    // ① 整数类型

    let rust = 415; // rust 默认是 i32

    let intRust8: i8 = 8;
    let intRustU8: u8 = 8;
    let intRust16: i16 = 16;
    let intRustU16: u16 = 16;
    let intRust32: i32 = 32;
    let intRustU32: u32 = 32;
    let intRust64: i64 = 64;
    let intRustU64: u64 = 64;
    // 有符号和无符号
    // 有符号可表示 负数
    // 无符号 比有符号多了一个位数,在正整数比无符号的大

    // ② 浮点类型
    // f32 和 f64 的小数点后面 位数不一样,所表示的精度也不一样
    // f64精度高
    let float32: f32 = 32.3200;
    let float64: f64 = 64.6400;

    // ③ 布尔型
    let f: bool = false;
    let t: bool = true;

    // ④字符类型
    // 字符类型是unicode值,char类型的
    // 不是string类型
    let z = 'z';
    let zz = '*';

    // ⑤范围类型
    let aa = 1..5;
    let bb = 1..100;
    for i in aa {
        println!("{}", i);
    }
}


三,复合数据类型
#[derive(Debug)]
struct Info {
    name: String,
    age: i32,
}

#[derive(Debug)]
enum ColorNoParam {
    Red,
    Yellow,
    Name(String),
}

fn main() {
    // ①元组类型
    // 元组类型是由()包裹起来,元素直接使用,隔开
    let temp = (1, 2, 3, 4, 5);
    let temp1: (i32, bool, &str) = (10, false, "111");
    println!("{}--{}", temp.1, temp1.2); // 2--111

    //② 数组类型
    let arr: [i32; 5] = [1, 2, 3, 4, 5];
    let arr1 = [1, 2, 3];
    let arr2 = [1; 5];
    println!("{:?}", arr); //[1, 2, 3, 4, 5]
    println!("{:?}", arr1); // [1, 2, 3]
    println!("{:?}", arr2); //[1, 1, 1, 1, 1]
    println!("{:?}--{}", arr.get(0), arr[2]);
    println!("{:?}", arr.get(10)); // None
    // 用 .get 安全些 不会出现  取值越界出错的情况

    // ③结构体数据类型
    // &'static str  这个是 引用类型的字符串,跟着程序销毁而销毁 少写

    let userinfo: Info = Info {
        name: String::from("张三"),
        age: 24,
    };
    println!("{}", userinfo.name); // 张三
    println!("{:#?}", userinfo); // Info {name: "张三", age: 24, }

    let user = Info {
        name: String::from("李四"),
        ..userinfo // 类似继承上一个结构体数据
    };
    println!("{}", user.name); // 李四
    println!("{:?}", user); // Info {name: "李四", age: 24, }

    // ④枚举类型

    let color_no_param = ColorNoParam::Name(String::from("张三"));

    println!("{:?}", color_no_param); //Name("张三")

    match color_no_param {
        ColorNoParam::Red => println!("red色"),
        ColorNoParam::Yellow => println!("黄色"),
        ColorNoParam::Name(name) => {
            println!("{}-----", name)
        }
        _ => {}
    }
}


四,容器类型
use std::collections::{HashMap, VecDeque};

fn main() {
    // rust 提供了 4种通用容器类型
    // 线性序列 :   Vec<T> 连续可变数组,VecDeque<T>连续存储的可变双端队列,LinkedList<T>非连续存储的双向链表
    // 键值对  :   HashMap<K,V> 哈希表的无序键-值对,BTreeMap<K,V> 基于B树的有序键值对按key排序
    // 集合   :   HashSet<T> 基于哈希表的无序集合,BTreeSet<T> 基于B树的有序集合
    // 优先队列   :     BinaryHeap<T>基于二叉堆的优先队列

    // ① Vec<T> 是动态可变的数组

    // 定义  Vec<T> 动态数组
    let mut _v_list: Vec<i32> = Vec::new(); // 创建空的动态数组
    let mut _v_list1: Vec<i32> = Vec::with_capacity(10); // 创建指定容量的动态数组,数组扩容会消耗资源,建议初始化动态数组的时候合理分配动态数组大小
    let mut _v_list2: Vec<i32> = vec![1, 2, 3]; // 通过 vec! 宏的方式 创建动态数组
    let mut _v_list3 = vec![1, 2, 3]; // 类型推到了省掉了 定义类型

    // 添加元素
    println!("{:?}", _v_list); // []
    _v_list.push(10);
    _v_list.push(101);
    _v_list.push(203);
    println!("{:?}", _v_list); // [10, 101, 203]

    // 通过索引修改元素
    _v_list[0] = 1000;
    println!("{:?}", _v_list); // [1000, 101, 203]

    // 删除元素
    let option = _v_list.pop(); // pop()删除 Vec<T> 最后一个元素
    println!("{:?}", option); // Some(203)
    println!("{:?}", _v_list); // [1000, 101]

    let option = _v_list.remove(1); // remove() 删除 Vec<T> 的指定下标元素
    println!("{:?}", option); // 101
    println!("{:?}", _v_list); // [1000]

    // 访问动态数组

    println!("{}", _v_list3[1]); // 通过下标访问
    println!("{}", _v_list3[2]);
    // 通过点.get()访问
    println!("{:?}", _v_list3.get(1)); // Some(2)
    // 通过点.get()访问 不会存在下标越界的情况
    println!("{:?}", _v_list3.get(10)); // None

    // 遍历元素
    println!("{:?}", _v_list3); // [1, 2, 3]
    for i in _v_list3 {
        println!("{}", i); // 1,2,3
    }

    for i in &mut _v_list2 {
        *i += 50;
        println!("{}", i);//51,52,53
    }

    // ② VecDeque<T> 是双端队列 遵从先进先出的原则

    let mut vDeque: VecDeque<u32> = VecDeque::new(); // 空双端队列
    let mut vDeque: VecDeque<u32> = VecDeque::with_capacity(10); // 容量为10的双端队列

    // 添加元素
    vDeque.push_front(10); // 向队列前面追加一个元素
    vDeque.push_front(20);
    vDeque.push_back(100); // 向队列后端追加一个元素
    vDeque.push_back(200);
    println!("{:?}", vDeque); // [20, 10, 100, 200]

    // 修改元素
    vDeque[0] = 111; // 通过下标修改
    println!("{:?}", vDeque); // [111, 10, 100, 200]

    // 删除元素
    let option = vDeque.pop_front(); // 删除队列前面元素
    println!("{:?}", vDeque); // [10, 100, 200]
    let option = vDeque.pop_back(); // 删除队列后面元素
    println!("{:?}", vDeque); // [10, 100]

    let option = vDeque.remove(1); // 通过索引删除
    println!("{:?}", vDeque); // [10]

    // 访问
    for i in 0..5 {
        vDeque.push_front(i);
    }
    println!("{:?}", vDeque); // [4, 3, 2, 1, 0, 10]

    // 下标访问
    println!("{}", vDeque[0]);// 4
    println!("{}", vDeque[3]);// 1
    println!("{}", vDeque[5]);// 10

    // .get()访问
    println!("{:?}", vDeque.get(6));//None
    println!("{:?}", vDeque.get(1));//Some(3)

    // ③ HashMap<K,V> 基于哈希算法来存储的键值对
    let mut map: HashMap<&str, i32> = HashMap::new(); // 空键值对
    let mut map: HashMap<&str, i32> = HashMap::with_capacity(10); // 容量为10的键值对

    // 添加 键-值
    map.insert("张三", 20);
    map.insert("李四", 21);
    println!("{:?}", map); // {"张三": 20, "李四": 21}
    map.insert("张三", 24); // 插入碰到 key相同的就更新对应的value
    println!("{:?}", map); // {"张三": 24, "李四": 21}

    // entry 和 or_insert方法来检查是否有对应的值
    let option = map.entry("张三"); // entry 检查张三是否存在
    map.entry("王五").or_insert(99); // key == 王五 不存在 就插入 王五:99
    println!("{:?}", map);//{"李四": 21, "王五": 99, "张三": 24}
    map.entry("王五").or_insert(999); // key == 王五 存在 就不插入 王五:99 没变999
    println!("{:?}", map);//{"李四": 21, "王五": 99, "张三": 24}

    // 修改 元素
    // map["张三"] = 100; // 无法分配 所有权问题
    // 1. 用insert 碰到相同的就更新
    map.insert("张三", 1000);
    println!("{:?}", map);// {"李四": 21, "张三": 1000, "王五": 99}
    // 2. 通过迭代器更新
    for (i, v) in map.iter_mut() {
        *v = *v + 10;
        println!("{:?}==={:?}", i, v); // k 和 v  都打印出来了
    }
    println!("{:?}", map);// {"李四": 31, "王五": 109, "张三": 1010}

    // 删除元素 remove()
    map.remove("李四"); // 删除成功
    println!("{:?}", map);// {"张三": 1010, "王五": 109}
    map.remove("李四"); // 删除失败 返回 none
    println!("{:?}", map);// {"张三": 1010, "王五": 109}

    // 访问元素
    // 1. 索引
    println!("{:?}", map["张三"]); // 1010
    // println!("{:?}", map["张三风"]); // 报错 , 不存在 张三丰 系统panic(奔溃)
    // 2. .get()
    println!("{:?}", map.get("张三")); // Some(1010)
    println!("{:?}", map.get("张三风")); // None
}


五,字符串
use std::collections::{HashMap, VecDeque};

fn main() {
    // 字符串类型
    // 1.固定长度字符串 &str
    let str = "刘洋";
    let str = String::from("张三").as_str(); // 先定义可变字符串 在转成 &str
    // 2.可变长度字符串 String
    let str = String::from("111");
    let str = String::new(); // 空字符串
    let str = "张三".to_string(); // 先定义 固定长度字符串在 转 string

    // 字符串的 增删改查 只有 String 类型的有       &str 是固定长的

    let mut s = String::new();

    // 追加 push  push_str
    s.push('R'); // 追加 字节的
    s.push_str("刘洋"); // 追加 string类型的
    println!("{}", s); // R刘洋

    // 插入 insert    insert_str
    s.insert(1, 'D'); // 插入 字节
    s.insert_str(1, "舞蹈"); // 插入 字符串
    println!("{}", s); // R舞蹈D刘洋

    // 链接字符串 + format!
    let a1 = String::from("我");
    let a2 = String::from("喜");
    let a3 = String::from("欢");
    let a4 = a1 + &a2 + &a3;
    println!("{}", a4);//我喜欢
    let a4 = format!("{}-{}", a2, a3); // 这里的a1的所有权  消失了
    println!("{}", a4); // 喜-欢

    // 替换字符串 replace替换所以  replacen替换次数
    let mut l = String::from("aaabbaaaacccbbaaaaaaabb");
    let l1 = l.replace("bb", "77");
    println!("{}", l1); // aaa77aaaaccc77aaaaaaa77
    let l2 = l.replacen("bb", "77", 2);
    println!("{}", l2); // aaa77aaaaccc77aaaaaaabb

    // 删除字符串
    let mut l = String::from("aa张三aa来了aa");
    println!("{}", l); //aa张三aa来了aa
    // 1. pop 删除最后一个 返回删除元素本身
    l.pop();
    println!("{}", l); //aa张三aa来了a
    // 2. remove 删除指定字符串
    l.remove(2);
    println!("{}", l); //aa三aa来了a
    // 3. truncate 删除指定字符串,指定位置 到 结尾的全部字符串
    l.truncate(2);
    println!("{}", l); //aa
    // 4. clear 等于 清空字符串
    l.clear();
    println!("{}", l); // ""

    // 字符串是以unicode字节集组成 ,最小的单位是  字节  1个汉字3个字节
    let mut l = String::from("aa张三aa来了aa");
    println!("{}", l.len()); //长度是 18

    // 字符串循环
    let bytes = l.bytes(); // 处理 字节的
    for i in bytes {
        println!("{}", i); // 18 97 97 ...
    }

    let chars = l.chars(); // 处理 utf-8的
    for i in chars {
        println!("{}", i); // a a 张 三 ...
    }
}


六,字面量

fn main() {
    println!("1111")
    // + - * / %
    //> < >= <= == !=
    // &&(两边为true,就为true,一个为false就是false) ||(一个为true就是true) !(取反)


    // & | ^ ! << >>  (完全是懵逼的)
    // 设计到 二进制 转码  掩码 补码 啥的  学过一次忘了 反正就很懵逼  也不知道学了干嘛用
    // 特别是  << >> 以后在复习吧
}



×

感谢您的支持,我们会一直保持!

扫码支持
请土豪扫码随意打赏

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

打赏作者
版权所有,转载注意明处:前端笔记 » rust的变量和数据类型

发表评论

路人甲 表情
Ctrl+Enter快速提交

网友评论(0)