Derive macrosを使ってstructにBuilder Patternを生やしてくれるやつを書いてみた

こんばんは、id:Krouton です。ISUCON10にRustで参加した話をてがきはてなブログで書こうと思ったら消えたので萎えました。ISUCON11までには書きます。多分...。

本題

Derive macros使ってますか?serdeとか使うと出てくる #[derive(Serialize, Deserialize)]の部分ですね。

Derive macrosでstructにBuilder Patternの実装を提供してくれる良さそうなライブラリ*1があって、練習のために実装の真似をしてました

use proc_builder_pattern::Builder;

#[derive(Default, Builder)]
struct Point {
    x: usize,
    y: usize,
}

ってやったら

struct Point {
  x: usize,
  y: usize,
}

impl Point {
    fn x(self, val: usize) -> Self {
        Self { x: val, ..self }
    }
}

impl Point {
    fn y(self, val: usize) -> Self {
        Self { y: val, ..self }
    }
}

Point::default().x(1).y(2)

って感じに使うことができます。 最初は解説を書こうと思ったけど実装とドキュメント読めば自明じゃね!?って思ったので実装したリポジトリだけ置きます、参考にしたライブラリは初期化してないメンバを検知する機構があったり、Intoを満たしてるように変換したりしてて便利だったので実用するならそっちを使ってください

github.com