天天看點

Rust -- as_ref與borrow的差別

as_ref是什麼?

as_ref是轉引用函數,将具有所有權對象轉換成引用對象,在不改變被轉換對象的基礎上産生一個引用對象。

as_ref并不是所有類型都預設支援,很多時候都需要自已去聲明。是AsRef trait的公共接口方法,隻有那些實作了as_ref公共接口方法的類型才能使用as_ref,目前有:Option, Box,Result這三種類型預設提供支援as_ref。

borrow是什麼?

允許owner把自已的擁用權“借出”,borrow實際上建立了到原始資源的reference,它是一種指針。

borrow分為兩種:immutable borrow和mutable borrow,并且編譯器對于一個作用域裡這兩種borrow的數量進行限制,進而避免讀寫的沖突。這裡比較特殊的是mutable borrow,即&mut,它可以把owner綁定到新的資源。在通過mutable borrow改變owner綁定的目标時,會觸發owner最初綁定資源的釋放。

as_ref與Borrow的差別

基礎資料類型引用

  Borrow可以直接在int, &str, String, vec, [], struct, enum 類型上直接指定&來引用。

  as_ref則不行,它需要聲明泛型 T:AsRef<int>, T: AsRef<str>, T:AsRef<struct name> 來支援。

嵌套資料類型引用:Some(&int), Box(&int)

  Borrow必須在定義結構時聲明 Some<&int>, Box<&int> 才是引用。

  as_ref 則直接可以在這些嵌套結構上使用as_ref。

引用的引用

  Borrow 引用的引用的表現形式是:&str->&&str

  as_ref 引用的引用的表現形式是:&str->&str