<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國際加速解決方案。 廣告
                # 方法語法 > [method-syntax.md](https://github.com/rust-lang/rust/blob/master/src/doc/book/method-syntax.md) commit 6ba952020fbc91bad64be1ea0650bfba52e6aab4 函數是偉大的,不過如果你在一些數據上調用了一堆函數,這將是令人尷尬的。考慮下面代碼: ~~~ baz(bar(foo)); ~~~ 我們可以從左向右閱讀,我們會看到“baz bar foo”。不過這不是函數被調用的順序,調用應該是從內向外的:“foo bar baz”。如果能這么做不是更好嗎? ~~~ foo.bar().baz(); ~~~ 幸運的是,正如對上面那個問題的猜測,你可以!Rust 通過`impl`關鍵字提供了使用*方法調用語法*(*method call syntax*)。 ### 方法調用 這是它如何工作的: ~~~ struct Circle { x: f64, y: f64, radius: f64, } impl Circle { fn area(&self) -> f64 { std::f64::consts::PI * (self.radius * self.radius) } } fn main() { let c = Circle { x: 0.0, y: 0.0, radius: 2.0 }; println!("{}", c.area()); } ~~~ 這會打印`12.566371`。 我們創建了一個代表圓的結構體。我們寫了一個`impl`塊,并且在里面定義了一個方法,`area`。 方法的第一參數比較特殊,`&self`。它有3種變體:`self`,`&self`和`&mut self`。你可以認為這第一個參數就是`x.foo()`中的`x`。這3種變體對應`x`可能的3種類型:`self`如果它只是棧上的一個值,`&self`如果它是一個引用,然后`&mut self`如果它是一個可變引用。因為我們我們的`area`以`&self`作為參數,我們就可以可以像其他參數那樣使用它。因為我們知道是一個`Circle`,我們可以像任何其他結構體那樣訪問`radius`字段。 我們應該默認使用`&self`,就像相比獲取所有權你應該更傾向于借用,同樣相比獲取可變引用更傾向于不可變引用一樣。這是一個三種變體的例子: ~~~ struct Circle { x: f64, y: f64, radius: f64, } impl Circle { fn reference(&self) { println!("taking self by reference!"); } fn mutable_reference(&mut self) { println!("taking self by mutable reference!"); } fn takes_ownership(self) { println!("taking ownership of self!"); } } ~~~ 你可以有任意多個`impl`塊。上面的例子也可以被寫成這樣: ~~~ struct Circle { x: f64, y: f64, radius: f64, } impl Circle { fn reference(&self) { println!("taking self by reference!"); } } impl Circle { fn mutable_reference(&mut self) { println!("taking self by mutable reference!"); } } impl Circle { fn takes_ownership(self) { println!("taking ownership of self!"); } } ~~~ ### 鏈式方法調用(Chaining method calls) 現在我們知道如何調用方法了,例如`foo.bar()`。那么我們最開始的那個例子呢,`foo.bar().baz()`?我們稱這個為“方法鏈”,我們可以通過返回`self`來做到這點。 ~~~ struct Circle { x: f64, y: f64, radius: f64, } impl Circle { fn area(&self) -> f64 { std::f64::consts::PI * (self.radius * self.radius) } fn grow(&self, increment: f64) -> Circle { Circle { x: self.x, y: self.y, radius: self.radius + increment } } } fn main() { let c = Circle { x: 0.0, y: 0.0, radius: 2.0 }; println!("{}", c.area()); let d = c.grow(2.0).area(); println!("{}", d); } ~~~ 注意返回值: ~~~ # struct Circle; # impl Circle { fn grow(&self, increment: f64) -> Circle { # Circle } } ~~~ 我們看到我們返回了一個`Circle`。通過這個函數,我們可以增長一個圓的面積到任意大小。 ### 關聯函數(Associated functions) 我們也可以定義一個不帶`self`參數的關聯函數。這是一個Rust代碼中非常常見的模式: ~~~ struct Circle { x: f64, y: f64, radius: f64, } impl Circle { fn new(x: f64, y: f64, radius: f64) -> Circle { Circle { x: x, y: y, radius: radius, } } } fn main() { let c = Circle::new(0.0, 0.0, 2.0); } ~~~ 這個*關聯函數*(*associated function*)為我們構建了一個新的`Circle`。注意靜態函數是通過`Struct::method()`語法調用的,而不是`ref.method()`語法。 ### 創建者模式(Builder Pattern) 我們說我們需要我們的用戶可以創建圓,不過我們只允許他們設置他們關心的屬性。否則,`x`和`y`將是`0.0`,并且`radius`將是`1.0`。Rust 并沒有方法重載,命名參數或者可變參數。我們利用創建者模式來代替。它看起像這樣: ~~~ struct Circle { x: f64, y: f64, radius: f64, } impl Circle { fn area(&self) -> f64 { std::f64::consts::PI * (self.radius * self.radius) } } struct CircleBuilder { x: f64, y: f64, radius: f64, } impl CircleBuilder { fn new() -> CircleBuilder { CircleBuilder { x: 0.0, y: 0.0, radius: 1.0, } } fn x(&mut self, coordinate: f64) -> &mut CircleBuilder { self.x = coordinate; self } fn y(&mut self, coordinate: f64) -> &mut CircleBuilder { self.y = coordinate; self } fn radius(&mut self, radius: f64) -> &mut CircleBuilder { self.radius = radius; self } fn finalize(&self) -> Circle { Circle { x: self.x, y: self.y, radius: self.radius } } } fn main() { let c = CircleBuilder::new() .x(1.0) .y(2.0) .radius(2.0) .finalize(); println!("area: {}", c.area()); println!("x: {}", c.x); println!("y: {}", c.y); } ~~~ 我們在這里又聲明了一個結構體,`CircleBuilder`。我們給它定義了一個創建者函數。我們也在`Circle`中定義了`area()`方法。我們還定義了另一個方法`CircleBuilder: finalize()`。這個方法從構造器中創建了我們最后的`Circle`。現在我們使用類型系統來強化我們的考慮:我們可以用`CircleBuilder`來強制生成我們需要的`Circle`。
                  <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>

                              哎呀哎呀视频在线观看