RUST 筆記(四)

東方柏發表於2018-11-21

通用集合 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),如果需要賦值,需要解引用,用星號(*)解引用

相關文章