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
