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