• 作成:
  • 更新:

Rustで外部crateの型にメソッドを実装する

Rustにはメソッド構文があります.

メソッド構文

となるとデータに関連する処理は単独関数ではなくメソッドで実装したいですね.

よし

type Comments = Arc<RwLock<BTreeMap<u32, String>>>;

impl Comments {
    fn lines(&self) -> Vec<String> {
        unimplemented!();
    }
}

これはエラーになります.

理由についてはRustのコヒーレンス - 簡潔なQを読みましょう.

ここでは手っ取り早く解決方法だけを書きます.

type Comments = Arc<RwLock<BTreeMap<u32, String>>>;

trait Lines {
    fn lines(&self) -> Vec<String>;
}

impl Lines for Comments {
    fn lines(&self) -> Vec<String> {
        unimplemented!();
    }
}

The newtype patternは元の型のメソッドが使えなくなるからこちらの解決方法の方が楽ですね.

命名規則について

今回は真剣にLineに値するtraitを作ってる疑惑があって微妙ですが,本当にハック的にメソッドを作りたいだけなら命名規則に沿ったほうが良さそうですね.