RUST 筆記(二)

東方柏發表於2018-11-05

所有權

  1. Rust 中的每一個值都有一個被稱為其 所有者(owner)的變數。
  2. 值有且只有一個所有者。
  3. 當所有者(變數)離開作用域,這個值將被丟棄。
    注意:
  4. 將值傳遞給函式在語義上與給變數賦值相似
  5. 返回值也可以轉移所有權

變數的所有權總是遵循相同的模式:將值賦給另一個變數時移動它。當持有堆中資料值的變數離開作用域時,其值將通過 drop 被清理掉,除非資料被移動為另一個變數所有

在每一個函式中都獲取所有權並接著返回所有權有些囉嗦。如果我們想要函式使用一個值但不獲取所有權該怎麼辦呢?–>slice

借用

& 符號就是 引用,它們允許你使用值但不獲取其所有權
我們將獲取引用作為函式引數稱為 借用(borrowing)
如果我們嘗試修改借用的變數呢?全部加上mut
引用的規則

  1. 在任意給定時間,要麼 只能有一個可變引用,要麼 只能有多個不可變引用。
  2. 引用必須總是有效。

slice

一個沒有所有權的資料型別是 slice。slice 允許你引用集合中一段連續的元素序列,而不用引用整個集合。

  1. 字串字面值就是 slice, let s = "hello world"; s 的型別就是$str
fn main() {
    for item in (1..4).rev() {
        println!("{}!", item);
    }
    println!("LIFTOFF!!");

    let s1 = String::from("hello");
    let s2 =s1; // 指標移動, s1被失效
    // println!("{}", s1);

    let x = 5;
    let y = x; // 已知大小,是棧不是堆,所以不是移動,是複製
    println!("x = {}, y = {}", x, y);

    let mut s3 = String::from("hello");
    changes(&mut s3);
    println!("{}", s3);

    // slice
    let mut s = String::from("hello,world!");
    let world = first_world(&s);
    s.clear();
}
fn changes(s: &mut String){
    s.push_str(", world!");
}

fn first_world(s: &String) -> &str{
    let bytes = s.as_bytes();
    for(i, &item) in bytes.iter().enumerate(){
        if item==b' ' {
            return &s[..i];
        }
    }
    &s[..]
}

相關文章