はじめに
#NO IMAGEThe Rust Programming Language 日本語版 - The Rust Programming Language 日本語版
を読んでいる
お勉強
#NO IMAGE高度なトレイト - The Rust Programming Language 日本語版
- 疲労困憊していた
- ここをやる
- ここやっている
メモ
#- これ思ったけど章節の節のタイトルがわかりずらいだけなんじゃねってなった
演算子に紐づいたトレイトを実装することで
std::opsに列挙された処理と対応するトレイトをオーバーロードできます。
- ぬーん?
- なんだこれは
- オーバーロードってなんだっけってなったけどオーバーライドとちがって同じ実装を行うだけだった
use std::ops::Add;
#[derive(Debug, PartialEq)]
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() {
assert_eq!(
Point { x: 1, y: 0 } + Point { x: 2, y: 3 },
Point { x: 3, y: 3 }
);
}
- これのどこがオーバーロードなんだよってなった
assert_eq!(Point { x: 1, y: 0 } + Point { x: 2, y: 3 },
- ここだ、あり得ない足し算してるけど
Addをimplすることでできるんだ - え、これめっちゃ面白いじゃん
NO IMAGEAdd in std::ops - RustThe addition operator +.
- じゃあ数字じゃないけどまったく同じ特性かつ概念があった場合は実装できるわけか
use std::ops::Add;
struct Millimeters(u32);
struct Meters(u32);
impl Add<Meters> for Millimeters {
type Output = Millimeters;
fn add(self, other: Meters) -> Millimeters {
Millimeters(self.0 + (other.0 * 1000))
}
}
- おおおお
- えーこれすごい
MillimetersをMetersに足すため、Selfという既定を使う代わりにimpl Add<Meters>を指定して、 RHS型引数の値をセットしています。
- RHSってなんやねん
- なぜかここで見つけた
まとめ
#- 今回は感動度が高かった
Addってオーバーロードできるんだなー- とはいえここができるから複雑な実装をするのは違うので意味を考えて実装していきたい
- これ遊戯王の型の実装に使えるやん
- 次はここ