目次

Rustの勉強[高度なトレイト その2]

(更新: )ぎじゅつ

はじめに

#

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 },
  • ここだ、あり得ない足し算してるけどAddimplすることでできるんだ
  • え、これめっちゃ面白いじゃん

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))
    }
}
  • おおおお
  • えーこれすごい

MillimetersMetersに足すため、Selfという既定を使う代わりにimpl Add<Meters>を指定して、 RHS型引数の値をセットしています。

  • RHSってなんやねん

NO IMAGEテストケース: 単位を扱う - Rust By Example 日本語版Rust by Example (RBE) is a collection of runnable examples that illustrate various Rust concepts and standard libraries.

  • なぜかここで見つけた

まとめ

#
  • 今回は感動度が高かった
  • Addってオーバーロードできるんだなー
    • とはいえここができるから複雑な実装をするのは違うので意味を考えて実装していきたい
  • これ遊戯王の型の実装に使えるやん
  • 次はここ

NO IMAGE高度なトレイト - The Rust Programming Language 日本語版