RustでStructにDerefトレイトを実装する

Derefは通常、参照外し演算子*をオーバーロードするために利用されるとのことです。今回は自分で作ったStructにDerefトレイトを実装して検証してみました。

use std::ops::Deref;

#[derive(Debug, PartialEq)]
struct UserId(u64);

impl Deref for UserId {
    type Target = u64;

    fn deref(&self) -> &u64 {
        &self.0
    }
}

fn main() {
    let id = UserId(36);

    // これは普通に同じだねって確かめている
    assert_eq!(&id, &UserId(36));

    // *でDerefの結果を得る
    assert_eq!(&*id, &36);

    // なのでこんなこともできた
    assert_eq!(*id * 2, 72);

    // チェーンでDerefが実行されていることを確認する
    assert_eq!(id.swap_bytes(), 2594073385365405696);
}

どうやらDerefはチェーンで呼び出された時も実行されるらしいので、swap_bytesが呼ばれるかも試すことができました。

参考

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA