RustのTrait
Haskellerなら型クラスとほぼ同じものと理解できるmrsekut.icon
型クラス制約のようなもの
継承
基本的な使用例
traitを定義する
code:rs
// traitを定義
trait HogeTrait {
fn hoge_method() -> u32; // methodは本体を書かない
}
traitを実装する
Hogeという型にHogeTraitを実装する
code:rs
impl HogeTrait for Hoge {
fn hoge_method() {
42
}
}
参考
前半しか読んでないmrsekut.icon
Rustのトレイトは「高カインド多相のない型クラス」である
任意の型がサポートできる性質
既存の型に任意のメソッドを生やせる
strやboolとかにも。
overloadの類型だが、以下のような機能がありmixinやinterfaceのようなもの メソッド呼び出し構文
Self型
関連付けられたmethod
関連関数
関連定数
マーカーとしての機能
型に対し実装すべきメソッドを定義したもの,
Haskellの型クラスと似ている部分が多い
型クラス、trait
型クラス制約、trait境界
default実装あり
継承あり
ad hoc多相
これhsでできたっけ?
derivingとか
例
生やしたmethodの名前衝突を避けるために、明示的にuseする必要がある
code:rs
let mut buf: Vec<u8> = vec![];
buf.write_all(b"hello")?;
このmodule内で、use std::io::Write;を書いていないとエラーになる
Cloneとiteratorは例外で、useしなくても良い
defaultで暗黙にuseされている
自動導出
#[derive(Hoge)]
型定義時に自動で実装する
実装をわざわざ手で書かなくて済む
code:rs
struct Annot<T> {
value: T,
loc: Loc,
}
標準ライブラリで導出可能なもの
Clone
Copy
Debug
Default
Eq
Hash
Ord
PartialEq
PartialOrd
Haskell由来らしい
Self型
hsにそんなんあったっけ
普通にclass Maybe s whereと書けば、Selfなsが決まるから、特に何も考えなくても良いか
関連付けられたmethod
Tour of Rust's Standard Library Traits
関連