二、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 borrowed
r1occurs 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 中的取位址...