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とか
例
値の列を生成できる
デフォルトでスコープに入っているのでimportしなくても使える
println!()とフォーマット指定し{:?}を使って出力することができる
Show型クラスのようなものかmrsekut.icon
Copy
#[derive(Copy)]
Copyトレイトを実装する場合、構造体の全てのメンバもCopyトレイトを実装している必要がある
例えばStringは実装していない←値を保持したメモリへのポインタが構造体のメモリ上にある
数値や列挙型の値は値そのものが構造体のメモリ上に配置されているので、それらのコピーは単純にメモリ上の値をコピーするだけで良い
#[derive(Clone)]
新しいメモリをアロケートし、そこに値をコピーする
自分のクローンをメモリ上に作ることができる
デフォルトでスコープに入っているのでimportしなくても使える
めっちゃ頻繁に使われる
半順序
f64はPartialOrdトレイトのみを実装している
NaNは他の値と大小が定まらない
Ord
全順序
大小比較に必ず成功する
u32はOrdトレイトを実装している
Sync
複数のスレッドから並列に扱われても、メモリ安全である 生やした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
関連