Rust 引用 借用

2021-10-12 13:56:03 字數 2927 閱讀 8793

二、rust借用

三、可變引用

四、懸垂引用

總結在rust 中的引用是什麼,引用有什麼用。這是我們下面的主題之一。

先上**

let r1 = string::

from

("hello world");

// 注意這裡沒有mut

let r2 =

&r1;

// 注意這裡沒有mut

這個&很神奇, 這樣給 r2 賦值以後 不會產生 rust中的move操作

這裡表示的就是引用,它們允許你使用值但不獲取其所有權

let r1_addr =

&r1 as *

const string as usize;

let r2_addr = r2 as *

const string as usize;

println!

("r1 value = {} address is 0x{}"

,r1,r1_addr)

; println!

("r2 value = {} address is 0x{}"

,r2,r2_addr)

;

這裡輸出一下上面 r1 和 r2 的位址你會發現他們的位址是一致的

這就證明他們指向了同一塊記憶體空間。

這裡我們解釋一下----「不獲得其所有權」

就是我們r2 引用了 r1 的值 但是沒有許可權改變這片空間的值。

這裡我們修改一下**

let r1 = string::

from

("hello world");

// 注意這裡沒有mut

let mut r2 =

&r1;

// 注意這裡的mut

let tmp_str = string::

from

(", peace and love");

r2 =

&tmp_str;

let r1_addr =

&r1 as *

const string as usize;

let r2_addr = r2 as *

const string as usize;

我們發現r2 的值可以正常更改,r2 已經指向了 tmp_str這個空間。

那如果在被 r1 在被 r2 引用期間 r1 改變了值怎麼辦,或者說根據rust的設計原則, r1 允許被更改嗎 ?????

錯誤**示範,好孩子不要學

let mut r1 = string::

from

("hello world");

// 注意這裡的mut

let mut r2 =

&r1;

// 注意這裡的mut

let tmp_str = string::

from

(", peace and love");

r1 = tmp_str;

// 肯定爆紅的 錯了哦這裡

let r1_addr =

&r1 as *

const string as usize;

let r2_addr = r2 as *

const string as usize;

我們看看提示的錯誤:

r1 = tmp_str;

^^ assignment to borrowedr1occurs here

將獲取引用作為函式引數稱為 借用

既然是借來的,肯定不能給人改了。

借來的東西你給人家改了,還回去時,還能還嗎,所以是不允許修改的。

fn main()

fn change

(r2:

&string)

fn change(r2: &string) , {}"

, r1, r2)

;自己檢查錯誤吧,別總看,手動起來敲一下 ,加深印象看看報了什麼錯。

rust 的設計機制,關於資料多引用,涉及資料競爭的,在大部分情況下,**編寫的時候就會跟你提示錯誤,都不用編譯。

在具有指標的語言中,很容易通過釋放記憶體時保留指向它的指標而錯誤地生成乙個 懸垂指標(dangling pointer),所謂懸垂指標是其指向的記憶體可能已經被分配給其它持有者。相比之下,在 rust 中編譯器確保引用永遠也不會變成懸垂狀態:當你擁有一些資料的引用,編譯器確保資料不會在其引用之前離開作用域

上面是rust程式語言設計裡的解釋,巴拉巴拉巴拉一大堆,

乍一看,這啥玩意啊。

鄙人的理解: 乙個變數"b"被"c"引用了,這時"b"的生命週期結束,會被drop掉,"c"就無效了,完了你還想"a"去接著這個"c"。 就是這玩意。

不過好在要是發生這種情況,在你寫**時編譯器就告訴你錯了。除非你沒安裝外掛程式提示。

fn main()

fn dangle()

->

&string

這裡鐵定報錯expected lifetime parameter

讓我們概括一下之前對引用的討論:

參考文章:

Rust 引用與借用

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

rust學習筆記 引用與借用

fn main is s1,len fn calculate length s string usize 上面的 中,calculate length s string 使用了string的引用傳遞引數,而沒有直接轉移值的所有權。在呼叫函式時也需要傳遞引數的引用。這些 代表的就是引用語義,它們允許你...

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

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