RustのTrait
RustのTrait
Ad Hoc多相を実現する
Haskellerなら型クラスとほぼ同じものと理解できるmrsekut.icon
trait bound
型クラス制約のようなもの
sub trait
継承
基本的な使用例
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-book-4873118557/254 (11章 トレイトとジェネリクス)
前半しか読んでないmrsekut.icon
#WIP
traitから型を作る構文が2つある
dyn Trait
impl Trait
具体的な型を隠蔽して、実装しているtraitだけに注目させる
時系列
impl Trait (return に導入)
Rust 1.26 (2018)
impl Trait (argument に導入)
Rust 1.27 (2018)
dyn の明示が必須になった
dyn Traitの概念自体は最初からあったが、明示しないといけなくなった
Rust 2018 edition
https://opaupafz2.hatenablog.com/entry/2022/02/12/100250
Rustのトレイトは「高カインド多相のない型クラス」である
任意の型がサポートできる性質
既存の型に任意のメソッドを生やせる
strやboolとかにも。
overloadの類型だが、以下のような機能がありmixinやinterfaceのようなもの
メソッド呼び出し構文
Rustの関連型
Self型
関連付けられたmethod
関連関数
関連定数
マーカーとしての機能
型に対し実装すべきメソッドを定義したもの,
Rustにはclassやprototypeはない
struct, traitを用いてOOPができる
型クラスとtraitの類似点
Haskellの型クラスと似ている部分が多い
型クラス、trait
型クラス制約、trait境界
default実装あり
継承あり
ad hoc多相
Associated Type Family、Rustの関連型
generic trait
/mrsekut-book-4873118557/277
これhsでできたっけ?
derivingとか
buddy trait
/mrsekut-book-4873118557/277
例
std::io::Write trait
Iterator trait
Debug trait
Copy trait
Clone trait
PartialOrd trait
Ord trait
Sync trait
生やしたmethodの名前衝突を避けるために、明示的にuseする必要がある
/mrsekut-book-4873118557/256#620270aa19827000002b9f51
code:rs
let mut buf: Vec<u8> = vec![];
buf.write_all(b"hello")?;
このwrite_all()はstd::io::Write traitのものだが、
このmodule内で、use std::io::Write;を書いていないとエラーになる
Cloneとiteratorは例外で、useしなくても良い
defaultで暗黙にuseされている
自動導出
#[derive(Hoge)]
型定義時に自動で実装する
実装をわざわざ手で書かなくて済む
code:rs
#derive(Debug, Clone, PartialEq, Eq, Hash)
struct Annot<T> {
value: T,
loc: Loc,
}
標準ライブラリで導出可能なもの
Clone
Copy
Debug
Default
Eq
Hash
Ord
PartialEq
PartialOrd
Haskell由来らしい
Rustの関連型
Self型
/mrsekut-book-4873118557/268
hsにそんなんあったっけ
普通にclass Maybe s whereと書けば、Selfなsが決まるから、特に何も考えなくても良いか
関連付けられたmethod
/mrsekut-book-4873118557/255
https://qnighy.hatenablog.com/entry/2017/04/01/070000
https://keens.github.io/blog/2017/12/01/rustnodi/
https://github.com/pretzelhammer/rust-blog/blob/master/posts/tour-of-rusts-standard-library-traits.md
Tour of Rust's Standard Library Traits
関連
Rustにおけるオブジェクト指向の考え方 - Qiita
自転車本 8章