Rust で特性オブジェクトがどのように実装されているかを理解しようとしています。以下の理解が正しいかどうか教えてください。
Write
特性を実装する任意の型を取る関数があります:
fn some_func(write_to: &mut Write) {}
このトレイトを実装し、上記の関数を呼び出す型がある場所では、コンパイラはおそらく への呼び出しを追加して、「トレイト オブジェクト」を生成しTraitObject::new(data, vtable)
ます。
次のようなものがある場合:
let input = get_user_input(); // say we are expecting the input to be 1 or 2
let mut file = File::new("blah.txt").unwrap();
let mut vec: Vec<u8> = vec![1, 2, 3];
match input {
1 => some_func(&mut file),
2 => some_func(&mut vec),
}
おそらく次のようになります。
match input {
1 => {
let file_write_trait_object: &mut Write =
TraitObject::new(&file, &vtable_for_file_write_trait);
some_func(file_write_trait_object);
}
2 => {
let vec_write_trait_object: &mut Write =
TraitObject::new(&vec, &vtable_for_vec_write_trait);
some_func(vec_write_trait_object);
}
}
コンパイラの内部では、渡さsome_func
れた vtable に基づいて使用されるメソッドにアクセスするだけです。TraitObject