<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [`Borrow`](http://doc.rust-lang.org/std/borrow/trait.Borrow.html)和[`AsRef`](http://doc.rust-lang.org/std/convert/trait.AsRef.html)特性非常相似。這是一個快速的關于這兩個特性意義的復習。 ## `Borrow` `Borrow`特性用于當你處于某種目的寫了一個數據結構,并且你想要使用一個要么擁有要么借用的類型作為它的同義詞。 例如,[`HashMap`](https://github.com/rust-lang/rust/blob/master/src/doc/std/collections/struct.HashMap.html)有一個用了`Borrow`的[`get`方法](https://github.com/rust-lang/rust/blob/master/src/doc/std/collections/struct.HashMap.html#method.get): ~~~ fn get<Q: ?Sized>(&self, k: &Q) -> Option<&V> where K: Borrow<Q>, Q: Hash + Eq ~~~ 這個簽名非常復雜。`k`參數是我們感興趣的。它引用了一個`HashMap`自身的參數: ~~~ struct HashMap<K, V, S = RandomState> { ~~~ `k`參數是`HashMap`用的`key`類型。所以,再一次查看`get()`的簽名,我們可以在鍵實現了`Borrow`時使用`get()`。這樣,我們可以創建一個`HashMap`,它使用`String`鍵,不過在我們搜索時使用`&str`: ~~~ use std::collections::HashMap; let mut map = HashMap::new(); map.insert("Foo".to_string(), 42); assert_eq!(map.get("Foo"), Some(&42)); ~~~ 這是因為標準庫`為 String 實現了Borrow`。 對于多數類型,當你想要獲取一個自我擁有或借用的類型,`&T`就足夠了。不過一個地方`Borrow`是有效的是當這里有多于一種借用的值。片段就是一個這一點特別正確的地方:你可以有`&[T]`或者`&mut [T]`。如果我們想接受這兩種類型,`Borrow`就是你需要的: ~~~ use std::borrow::Borrow; use std::fmt::Display; fn foo<T: Borrow<i32> + Display>(a: T) { println!("a is borrowed: {}", a); } let mut i = 5; foo(&i); foo(&mut i); ~~~ 這會打印出`a is borrowed: 5`兩次。 ## `AsRef` `AsRef`特性是一個轉換特性。它用來在泛型中把一些值轉換為引用。像這樣: ~~~ let s = "Hello".to_string(); fn foo<T: AsRef<str>>(s: T) { let slice = s.as_ref(); } ~~~ ## 我應該用哪個? 我們可以看到它們有些相似:它們都處理一些類型的自我擁有和借用版本。然而,它們還是有些不同。 選擇`Borrow`當你想要抽象不同類型的借用,或者當你創建一個數據結構它把自我擁有和借用的值看作等同的,例如哈希和比較。 選擇`AsRef`當你想要直接把一些值轉換為引用,和當你在寫泛型代碼的時候。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看