Rust
演算子とオーバーロード
サーチ…
前書き
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