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

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 運算符與重載 > [operators-and-overloading.md](https://github.com/rust-lang/rust/blob/master/src/doc/book/operators-and-overloading.md) commit 6ba952020fbc91bad64be1ea0650bfba52e6aab4 Rust 允許有限形式的運算符重載。特定的運算符可以被重載。要支持一個類型間特定的運算符,你可以實現一個的特定的重載運算符的trait。 例如,`+`運算符可以通過`Add`特性重載: ~~~ use std::ops::Add; #[derive(Debug)] struct Point { x: i32, y: i32, } impl Add for Point { type Output = Point; fn add(self, other: Point) -> Point { Point { x: self.x + other.x, y: self.y + other.y } } } fn main() { let p1 = Point { x: 1, y: 0 }; let p2 = Point { x: 2, y: 3 }; let p3 = p1 + p2; println!("{:?}", p3); } ~~~ 在`main`中,我們可以對我們的兩個`Point`用`+`號,因為我們已經為`Point`實現了`Add<Output=Point>`。 有一系列可以這樣被重載的運算符,并且所有與之相關的trait都在[`std::ops`](http://doc.rust-lang.org/stable/std/ops/)模塊中。查看它的文檔來獲取完整的列表。 實現這些特性要遵循一個模式。讓我們仔細看看[`Add`](http://doc.rust-lang.org/stable/std/ops/trait.Add.html): ~~~ # mod foo { pub trait Add<RHS = Self> { type Output; fn add(self, rhs: RHS) -> Self::Output; } # } ~~~ 這里總共涉及到3個類型:你`impl Add`的類型,`RHS`,它默認是`Self`,和`Output`。對于一個表達式`let z = x + y`,`x`是`Self`類型的,`y`是`RHS`,而`z`是`Self::Output`類型。 ~~~ # struct Point; # use std::ops::Add; impl Add<i32> for Point { type Output = f64; fn add(self, rhs: i32) -> f64 { // add an i32 to a Point and get an f64 # 1.0 } } ~~~ 將允許你這樣做: ~~~ let p: Point = // ... let x: f64 = p + 2i32; ~~~ ### 在泛型結構體中使用運算符 trait 現在我們知道了運算符 trait 是如何定義的了,我們可以更通用的定義來自[trait 章節]()的`HasArea` trait 和`Square`結構體: ~~~ use std::ops::Mul; trait HasArea<T> { fn area(&self) -> T; } struct Square<T> { x: T, y: T, side: T, } impl<T> HasArea<T> for Square<T> where T: Mul<Output=T> + Copy { fn area(&self) -> T { self.side * self.side } } fn main() { let s = Square { x: 0.0f64, y: 0.0f64, side: 12.0f64, }; println!("Area of s: {}", s.area()); } ~~~ 對于`HasArea`和`Square`,我們聲明了一個類型參數`T`并取代`f64`。`impl`則需要更深入的修改: ~~~ impl<T> HasArea<T> for Square<T> where T: Mul<Output=T> + Copy { ... } ~~~ `area`方法要求我們可以進行邊的乘法,所以我們聲明的`T`類型必須實現`std::ops::Mul`。比如上面提到的`Add`,`Mul`自身獲取一個`Output`參數:因為我們知道相乘時數字并不會改變類型,我也設定它為`T`。`T`也必須支持拷貝,所以 Rust 并不嘗試將`self.side`移動進返回值。
                  <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>

                              哎呀哎呀视频在线观看