サーチ…


前書き

Rustのほとんどの演算子は、ユーザー定義型に対して定義できます( "オーバーロード")。これは、 std::opsモジュールにそれぞれの特性を実装することで実現できます。

加算演算子のオーバーロード(+)

加算演算子(+)をオーバーロードするには、 std::ops::Add特性を実装する必要があります。

ドキュメントから、特性の完全な定義は次のとおりです。

pub trait Add<RHS = Self> {
    type Output;
    fn add(self, rhs: RHS) -> Self::Output;
}

どのように機能するのですか?

  • この特性は、左手側のタイプ
  • 特性は、指定されていない限り、 1つの右手側引数と同じ型を持つように指定されていない限り、 1つの右手側引数に対して実装されます
  • 加算の結果の型は、関連する型で指定されますOutput

したがって、3つの異なるタイプを有することが可能である。

注意:特性は左辺と右辺の引数であるので、裸の型ではなく型への参照のために実装することをお勧めします。


カスタムタイプのために+を実装する:

use std::ops::Add;

#[derive(Clone)]
struct List<T> {
    data: Vec<T>,
}
//  Implementation which consumes both LHS and RHS
impl<T> Add for List<T> {
    type Output = List<T>;

    fn add(self, rhs: List<T>) -> List<T> {
        self.data.extend(rhs.data.drain(..));
        self
    }
}

//  Implementation which only consumes RHS (and thus where LHS != RHS)
impl<'a, T: Clone> Add<List<T>> for &'a List<T> {
    type Output = List<T>;

    fn add(self, rhs: List<T>) -> List<T> {
        self.clone() + rhs
    }
}


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow