2017-12-01 2 views
0

私はRustでどのように特性オブジェクトが実装されているかを理解しようとしています。次のような理解が正しいかどうかをお知らせください。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内部だけに沿って渡さTraitObject中のvtableに基づいて使用されるメソッドにアクセスするコンパイラ。

+0

[TraitObject']のドキュメント(https://doc.rust-lang.org/std/raw/struct.TraitObject.html)を読んだことがありますか?* 'TraitObject'はレイアウトと一致することが保証されていますしかし、それは特性オブジェクトの種類ではなく[...]、またレイアウト[...]を制御しません。 * – Shepmaster

+0

@Shepmaster:コンパイラがどのように特性オブジェクトを構築し、呼び出された関数に渡すかという "アイデア"をキャプチャしているかどうかを知りたかったのですが。 – user3169543

答えて

0

特性オブジェクトは脂肪ポインタなので、fn some_func(write_to: &mut Write)fn some_func(_: *mut OpaqueStruct, _: *const WriteVtable)のようなものにコンパイルされます。

関連する問題