rust學習筆記 引用與借用

2021-10-09 01:14:23 字數 1655 閱讀 6142

fn main() ' is {}.", s1, len);

}fn calculate_length(s: &string) -> usize

上面的**中,calculate_length(s: &string)使用了string的引用傳遞引數,而沒有直接轉移值的所有權。在呼叫函式時也需要傳遞引數的引用。

這些&代表的就是引用語義,它們允許你在不獲取所有權的情況下使用值。

注意:與&操作相反的是 * 操作,* 代表解引用

上面這種通過引用傳遞引數給函式的方法也被稱為借用,借用來的值預設不能被修改,否則會報錯,編譯無法通過:

//錯誤**

fn main()

fn change(some_string: &string)

我們可用過一些調整來使借用來的值可變:可變引用。

fn main() 

fn change(some_string: &mut string)

我們需要做三個步驟,寫三個mut:

將變數設定為可變 mut

將引用實參設定為可變 &mut

將引用形參設定為可變 &mut

在可變引用的使用上有乙個很大的限制:在乙個作用域中,同時只能存在乙個可變引用。

以下為錯誤**:

//錯誤**

fn main() , {}", r1, r2);

}

這種限制可以幫助我在編譯時避免資料競爭。資料競爭和競態條件十分類似,它會在指令滿足以下條件時發生:

rust中可以使用花括號來創造作用域,所以可以使兩個可變引用在兩個不同的作用域中:

fn main()  // r1 goes out of scope here, so we can make a new reference with no problems.

let r2 = &mut s;

}

對於引用還有乙個限制:不可以在有不可變引用時,使用可變引用。

fn main() , {}, and {}", r1, r2, r3);

}

因為程式設計師大部分時候都不希望自己的唯讀值突然發生改變。

總結兩個限制:在同一作用域中,如果存在乙個可變引用,則不能使用其他任何引用。

懸垂引用比較類似野指標,指的是指向曾經存在某處記憶體位址,但該記憶體已經被釋放甚至重新分配另作他用了。

在rust的設計中,能保證這個資料不會再引用被銷毀前離開自己的作用域。(這句話挺繞的,我的理解就是引用指向的資料始終都是有效的,也一直是你指向的那個,不會改變)

如下是錯誤**:

//錯誤**

fn main()

fn dangle() -> &string

其實,這部分只需要把引用去掉就可以使用了。如果一定要用引用會涉及生命週期,這在後面討論它。

Rust 引用與借用

我們的上一遍內容的 有這樣乙個問題 我們必須將string返回給呼叫函式,以便在呼叫calculatelen後仍能使用string,因為string被移動到了calculatelen內。下面是如何定義並使用乙個 新的 calculatelen函式,它以乙個物件的引用作為引數而不是獲取值的所有權 fu...

Rust 引用 借用

二 rust借用 三 可變引用 四 懸垂引用 總結在rust 中的引用是什麼,引用有什麼用。這是我們下面的主題之一。先上 let r1 string from hello world 注意這裡沒有mut let r2 r1 注意這裡沒有mut這個 很神奇,這樣給 r2 賦值以後 不會產生 rust中...

rust 語法和語義 10 引用和借用

引用和借用 references and borrowing 所有權概念將依照官方介紹,分為3個部分說明 操作格式 宣告example t引用 物件不可變 vec mut t 引用 物件 可變 mut vec 訪問 可變物件的引用 似乎類似 c 中的取位址操作,獲得乙個指標 似乎類似 c 中的取位址...