trait object
traitを実装するobjectのpointer
実行時に型が決まる
サイズが不定 (?Sized) のため、ポインタ経由で扱う
例
rslet mut buf: Vec<u8> = vec![];
let writer: &mut Write = &mut buf;
ここでの値 writer
がtrait object
&mut Trait
のような型になる
Write
はtraitの1つ

何と何を指している?
値へのpointer
これは普通のpointer

コンパイル時に、その型用のtraitの実装が紐付けられる
上のコード例で言えば、 impl Write for Vec<u8> {..}
の実装が紐付けられる
何が嬉しいのかよくわかっていない
嬉しいと以下嬉しくないとかではなく、そういう構造で実装してますよ、ってだけかもしれない
他の知っている言語へのアナロジーをうまくできていない
たぶんそんな難しいものではなく、身近なものなんだろうなという気はしている
tsinterface 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
なのかは、コンパイル時には決定できない