<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國際加速解決方案。 廣告
                # 通用函數調用語法 > [ufcs.md](https://github.com/rust-lang/rust/blob/master/src/doc/book/ufcs.md) commit 024aa9a345e92aa1926517c4d9b16bd83e74c10d 有時,函數可能有相同的名字。就像下面這些代碼: ~~~ trait Foo { fn f(&self); } trait Bar { fn f(&self); } struct Baz; impl Foo for Baz { fn f(&self) { println!("Baz’s impl of Foo"); } } impl Bar for Baz { fn f(&self) { println!("Baz’s impl of Bar"); } } let b = Baz; ~~~ 如果我們嘗試調用`b.f()`,我們會得到一個錯誤: ~~~ error: multiple applicable methods in scope [E0034] b.f(); ^~~ note: candidate #1 is defined in an impl of the trait `main::Foo` for the type `main::Baz` fn f(&self) { println!("Baz’s impl of Foo"); } ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ note: candidate #2 is defined in an impl of the trait `main::Bar` for the type `main::Baz` fn f(&self) { println!("Baz’s impl of Bar"); } ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~ 我們需要一個區分我們需要調用哪一函數的方法。這個功能叫做“通用函數調用語法”(universal function call syntax),這看起來像這樣: ~~~ # trait Foo { # fn f(&self); # } # trait Bar { # fn f(&self); # } # struct Baz; # impl Foo for Baz { # fn f(&self) { println!("Baz’s impl of Foo"); } # } # impl Bar for Baz { # fn f(&self) { println!("Baz’s impl of Bar"); } # } # let b = Baz; Foo::f(&b); Bar::f(&b); ~~~ 讓我們拆開來看。 ~~~ Foo:: Bar:: ~~~ 調用的這一半是兩個traits的類型:`Foo`和`Bar`。這樣實際上就區分了這兩者:Rust調用你使用的trait里面的方法。 ~~~ f(&b) ~~~ 當我們使用[方法語法](#)調用像`b.f()`這樣的方法時,如果`f()`需要`&self`,Rust實際上會自動地把`b`借用為`&self`。而在這個例子中,Rust并不會這么做,所以我們需要顯式地傳遞一個`&b`。 ### 尖括號形式(Angle-bracket Form) 我們剛才討論的通用函數調用語法的形式: ~~~ Trait::method(args); ~~~ 上面的形式其實是一種縮寫。這是在一些情況下需要使用的擴展形式: ~~~ <Type as Trait>::method(args); ~~~ `<>::`語法是一個提供類型提示的方法。類型位于`<>`中。在這個例子中,類型是`Type as Trait`,表示我們想要`method`的`Trait`版本被調用。在沒有二義時`as Trait`部分是可選的。尖括號也是一樣。因此上面的形式就是一種縮寫的形式。 這是一個使用較長形式的例子。 ~~~ trait Foo { fn foo() -> i32; } struct Bar; impl Bar { fn foo() -> i32 { 20 } } impl Foo for Bar { fn foo() -> i32 { 10 } } fn main() { assert_eq!(10, <Bar as Foo>::foo()); assert_eq!(20, Bar::foo()); } ~~~ 使用尖括號語法讓你可以調用指定trait的方法而不是繼承到的那個。
                  <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>

                              哎呀哎呀视频在线观看