generated at
trait object
RustのTraitへの参照のこと
fat pointerである





traitを実装するobjectのpointer
実行時に型が決まる
サイズが不定 (?Sized) のため、ポインタ経由で扱う



rs
let mut buf: Vec<u8> = vec![]; let writer: &mut Write = &mut buf;
ここでの値 writer がtrait object
&mut Trait のような型になる
Write はtraitの1つmrsekut



trait objectはfat pointer
何と何を指している?
値へのpointer
これは普通のpointermrsekut
値の型を表すテーブル(vtable)へのpointer
これのことをvptrと呼ぶっぽい
コンパイル時に、その型用のtraitの実装が紐付けられる
上のコード例で言えば、 impl Write for Vec<u8> {..} の実装が紐付けられる


何が嬉しいのかよくわかっていない
嬉しいと以下嬉しくないとかではなく、そういう構造で実装してますよ、ってだけかもしれない
他の知っている言語へのアナロジーをうまくできていない
/mrsekut-book-4873118557/257にJavaのinterfaceの説明があるがJavaがわからん
たぶんそんな難しいものではなく、身近なものなんだろうなという気はしている
ts
interface IWriter { write(str: string): void } class Writer1 implements IWriter { write(str: string): void { console.log(str) } } class Writer2 implements IWriter { write(str: string): void { console.log(str) } } const w: IWriter = new ????; w.write('hoge')
こんな風に書いた時の、 w と同じ?
w 自体は、 IWriter 型で、interfaceに依存している
実体が、 Writer1 なのか Writer2 なのかは、コンパイル時には決定できない