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 は元の型のメソッドが使えなくなるからこちらの解決方法の方が楽ですね.
命名規則について
RFC0445 https://t.co/kPQ0l9eSgq ではこのようなトレイトにFooExtという命名規則を使うことが推奨されています
— Masaki Hara (@qnighy) 2019年2月8日
今回は真剣にLine
に値するtraitを作ってる疑惑があって微妙ですが,
本当にハック的にメソッドを作りたいだけなら命名規則に沿ったほうが良さそうですね.