<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                標準庫提供了一個特殊的特性,[`Deref`](http://doc.rust-lang.org/nightly/std/ops/trait.Deref.html)。它一般用來重載`*`,解引用運算符: ~~~ use std::ops::Deref; struct DerefExample<T> { value: T, } impl<T> Deref for DerefExample<T> { type Target = T; fn deref(&self) -> &T { &self.value } } fn main() { let x = DerefExample { value: 'a' }; assert_eq!('a', *x); } ~~~ 這對編寫自定義指針類型很有用。然而,這里有一個與`Deref`相關的語言功能:“解引用強制多態(deref coercions)”。規則如下:如果你有一個`U`類型,和它的實現`Deref`,(那么)`&U`的值將會自動轉換為`&T`。這是一個例子: ~~~ fn foo(s: &str) { // borrow a string for a second } // String implements Deref<Target=str> let owned = "Hello".to_string(); // therefore, this works: foo(&owned); ~~~ 在一個值的前面用`&`號獲取它的引用。所以`owned`是一個`String`,`&owned`是一個`&String`,而因為`impl Deref for String`,`&String`將會轉換為`&str`,而它是`foo()`需要的。 這就是了。這是Rust唯一一個為你進行一個自動轉換的地方,不過它增加了很多靈活性。例如,`Rc`類型實現了`Deref`,所以這可以工作: ~~~ use std::rc::Rc; fn foo(s: &str) { // borrow a string for a second } // String implements Deref<Target=str> let owned = "Hello".to_string(); let counted = Rc::new(owned); // therefore, this works: foo(&counted); ~~~ 我們所做的一切就是把我們的`String`封裝到了一個`Rc`里。不過現在我們可以傳遞`Rc`給任何我們有一個`String`的地方。`foo`的簽名并無變化,不過它對這兩個類型都能正常工作。這個例子有兩個轉換:`Rc`轉換為`String`接著是`String`轉換為`&str`。只要類型匹配Rust將可以做任意多次這樣的轉換。 標準庫提供的另一個非常通用的實現是: ~~~ fn foo(s: &[i32]) { // borrow a slice for a second } // Vec<T> implements Deref<Target=[T]> let owned = vec![1, 2, 3]; foo(&owned); ~~~ 向量可以`Deref`為一個片段。 ## `Deref`和方法調用 當調用一個方法時`Deref`也會出現。換句話說,這兩個(應該是`T`和`&T`)在Rust中是一樣的: ~~~ struct Foo; impl Foo { fn foo(&self) { println!("Foo"); } } let f = Foo; f.foo(); ~~~ 即便`f`不是一個引用,而`foo`獲取`&self`,這也是可以工作的。因為這些都是一樣的: ~~~ f.foo(); (&f).foo(); (&&f).foo(); (&&&&&&&&f).foo(); ~~~ 一個`&&&&&&&&&&&&&&&&Foo`類型的值仍然可以調用`Foo`定義的方法,因為編譯器會插入足夠多的`*`來使類型正確。而正因為它插入`*`,它用了`Deref`。
                  <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>

                              哎呀哎呀视频在线观看