🍕

Rustのトレイトはプリミティブ型にも実装できる

2021/07/04に公開

Rustのトレイトはあらゆる型に実装でき、プリミティブ型も例外ではありません。
以下はプリミティブ型のusizeにtimesメソッドを生やすべく、Timesトレイトを定義、実装する例です。

trait Times {
    fn times<F: FnMut()>(self, f: F);
}

impl Times for usize {
    fn times<F: FnMut()>(self, mut f: F) {
        (0..self).for_each(|_| f());
    }
}

fn main() {
    10.times(|| println!("ピザ"));
}

こんな出力になります。

ピザ
ピザ
ピザ
ピザ
ピザ
ピザ
ピザ
ピザ
ピザ
ピザ

既存の型にメソッドを生やせるのはRubyのオープンクラスみたいですね。

GitHubで編集を提案

Discussion