RUST 笔记(四)

通用集合 vector、字符串、 哈希 map

vector(可以理解为list)

  1. 初始化
    let v: Vec<i32> = Vec::new();
    使用初始值来创建 vec! 宏:let v = vec![1, 2, 3];
  2. 使用 vector
    
    //新增值
    v.push(5);
    
    //读取值
    let v = vec![1, 2, 3, 4, 5];
    let third: &i32 = &v[2]; // 访问不存在的元素时 Rust 会造成 panic!
    let third: Option<&i32> = v.get(2); // Some(&element) 或 None 的逻辑
    
    //遍历读
    let v = vec![100, 32, 57];
    for i in &v {
        println!("{}", i);
    }
    //遍历写
    let mut v = vec![100, 32, 57];
    for i in &mut v {
        *i += 50;
    }
    
  3. vector 只能存储一种类型,如果需要多种类型,使用枚举
    enum SpreadsheetCell {
        Int(i32),
        Float(f64),
        Text(String),
    }
    
    let row = vec![
        SpreadsheetCell::Int(3),
        SpreadsheetCell::Text(String::from("blue")),
        SpreadsheetCell::Float(10.12),
    ];
    

字符串 str String

Rust 的核心语言中只有一种字符串类型:str。字符串 slice,它通常以被借用的形式出现,&str

String 类型字符串是由标准库提供的,而没有写进核心语言部分,它是可增长的、可变的、有所有权的、UTF-8 编码的字符串类型。

  1. 新建字符串

    let mut s = String::new();
    
    let data = "initial contents";
    
    let s = data.to_string();
    
    let s = String::from("initial contents");
    
  2. 更新字符串

    1. 通过 push_str 方法来附加字符串 slice,从而使 String 变长:s.push_str(“bar”);
    2. push 方法被定义为获取一个单独的字符作为参数,并附加到 String 中:s.push(‘l’);
  3. 字符串使用 + 运算符

    1. add 函数限制,只能将 &str 和 String 相加,不能将两个 String 值相加
    2. 字符串作为参数传入时 &String 默认可以被强转(coerced)为 &str
  4. 字符串format

    format! 与 println! 的工作原理相同,不过不同于将输出打印到屏幕上,它返回一个带有结果内容的 String

    let s = format!("{}-{}-{}", s1, s2, s3); 替代 let s = s1 + “-” + &s2 + “-” + &s3;

  5. 字符串用不可以索引取值

    1. 字符串基于 vector 实现
    2. 英文占一个字节,中文占两个字节。
    3. 区分英文字节、中文字节(unicode)、字符(最接近人们眼中字母的概念)。最终都以以utf-8形式存储,存储形式是ascii[224, 164, 168]
  6. 截取部分字符串

    1. 索引超出会在运行时会 panic,程序崩溃
      let hello = “Здравствуйте”;
      let s = &hello[0…4]; // s 将会是 “Зд”
    2. 从字符串中获取字形簇是很复杂的,所以标准库并没有提供这个功能
  7. 遍历字符串
    chars方法、bytes方法

    for c in "नमस्ते".chars() {
        println!("{}", c);
    }
    

哈希 map HashMap<K, V>储存键值对

  1. hashMap 需要引入库 use std::collections::HashMap

  2. 新插入或更新 map.insert(String::from("Blue"), 10);

  3. 像 vector 一样,哈希 map 将它们的数据储存在堆上。同样类似于 vector,哈希 map 是同质的:所有的键必须是相同类型,值也必须都是相同类型。

  4. 两个元组也可以生成一个哈希map:let map: HashMap<_, _> = 元组1.iter().zip(元组2.iter()).collect();

  5. 所有权:一旦键值对被插入后就为哈希 map 所拥有

  6. 获取map中的值map.get(),返回Option

  7. 遍历

    for (key, value) in &scores {
        println!("{}: {}", key, value);
    }
    
  8. 只在键不存在时插入

    1. entry 函数的返回值是一个枚举,Entry,它代表了可能存在也可能不存在的值。
    2. 不存在就插入:map.entry(String::from("Yellow")).or_insert(50);并返回修改过的 Entry 的建的值得一个可变引用(&mut V),如果需要赋值,需要解引用,用星号(*)解引用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值