AsRef Deref和Borrow有哪些區別?

時間 2021-07-07 21:48:38

1樓:PTLin

雖然這條肯定會被摺疊,但是我還是要說:親,這邊建議你去閱讀文件呢,文件寫的就差把東西餵給你了,而且你還能看什麼型別實現了這個Trait,看不懂就用翻譯軟體,之後還有async,pin各種各樣的東西等著你呢。

2樓:

pubtrait

AsRef

Sized

>pubtrait

Borrow

Sized

>pubtrait

Deref

首先從簽名上看,它們的共同點是實現&T到&U的轉換。區別在於AsRef和Borrow都是帶了泛型引數的, 這意味著它們的實現者可以同時有多種轉換(&T->&U1, &T->&U2 ...),而Deref用的是關聯型別,只能有一種這樣轉換。

AsRef是用於一般的、輕量級的且不會失敗的不同型別的引用之間的轉換。

(如果轉換開銷較大請用impl From<&T> for &U,如果可能失敗請用乙個返回Option或者Result的專用方法)

Borrow是用於乙個型別的不同表示型別(如Box, Rc,Cow)的引用到原型別(T)引用的轉換。

(這些表示型別為不同用途提供了額外的功能,如Box和Rc為T提供的記憶體管理,Cow提供的寫時複製)

它要求Hash, Ord, Eq 在轉換前後等價,如x.borrow() == y.borrow()和x == y的結果應該相同。

Borrow對所有T和&T都有個預設的空實現(&T->&T),所以可以用它來同時接收T和&T:

usestd::borrow::Borrow

;structS;

fnf(_: impl

Borrow

)fn

main

()Deref是為智慧型指標設計的,只應被智慧型指標型別實現。它會根據解引用規則自己動,不需要顯式的呼叫.deref(), 並且如果T實現了Deref 那麼&T可以隱式轉換成&U。

參考:AsRef in std::convert - Rust

Borrow in std::borrow - Rust

Deref in std::ops - Rust

The Rust Reference

3樓:RustDesk

Deref是deref操作符*的 trait,比如*v。在修改mut&的值的時候會用到。Deref還會有更多深層次的巢狀,比如把其它型別的指標(比如在庫中定義的,Box, Rc, Arc, Cow 等),轉成內部標準形式 &v;或者把多重 & (比如:

&&&&&&&v),簡化成 &v(通過插入足夠數量的 * 進行解引)。

fn set_value(a: &mut usize, v: usize)

AsRef trait提供了乙個方法.as_ref(),對應於.as_mut() 的是AsMut。我們在使用Option的時候會經常使用到。

let c = Some(T{});

if let Some(x) = c.as_ref

如果你直接使用

if let Some(x) = c

會發生move或者copy操作。

Borrow和AsRef很像,但是更繞,會對ref的型別做轉換,我也很少直接使用到。典型應用就是HashMap的get函式,我們可以使用 String 型別作為 HashMap 的 key,而使用 &str 進行搜尋。

impl HashMap {

pub fn insert(&self, key: K, value: V) -> Option

where K: Hash + Eqpub fn get(&self, k: &Q) -> Option<&V>

where

K: BorrowQ: Hash + Eq + ?Sized

so that和such that和too,to的區別?

風zz 1 so that 引導目的狀語從句。意思是 以便,為了 so 形容詞或副詞原形 that 引導結果狀語從句。意思是 如此 以致 此時可與too.to.互用。2 such a an 形容詞 名詞單數 that,或such 形容詞 不可數名詞或複數名詞 that 意思是 如此 以致 3 too...

Jennie和Lisa Rosie和Jennie不合是真的嗎?

鶴映辰 假的!假的!假的!BLACKPINK成團加上練習生時期大概 將近十年的感情你跟我說她們不合?不合早就be了 DASISIANNIECYR jenlisa一起當的練習生我們看不到那段時光但是能一起承受痛苦的一定關係很好 D jenlisayyds 至於jen和rose應該比較business吧...

關於dubbo和zookeeper和solr的關係和作用?

ZooKeeper 是乙個註冊中心,採用類似資料夾目錄的方式儲存資料,儲存了已經啟動的服務的資訊,如ip 埠 介面 方法列表 版本號等,儲存成乙個URL。dubbo 是乙個分布式服務治理框架,它連線到 ZooKeeper 上查詢依賴的其他服務的資訊,然後和其他服務建立長連線。當你通過 dubbo 呼...