dyn Trait
Além de usar traits para despacho eståtico via genéricos, o Rust também suporta uså-los para despacho dinùmico, apagamento de tipo, via objetos de trait:
Speaker Notes
This slide should take about 5 minutes.
-
Os genéricos, incluindo
impl Trait
, usam a monomorfização para criar uma instùncia especializada da função para cada tipo diferente com o qual o genérico é instanciado. Isso significa que chamar um método de trait de dentro de uma função genérica ainda usa despacho eståtico, pois o compilador tem todas as informaçÔes de tipo e pode resolver qual tipo de implementação do trait ele deverå utilizar. -
Quando se usa
dyn Trait
, ele usa despacho dinĂąmico atravĂ©s de uma tabela de mĂ©todos virtuais (vtable). Isso significa que hĂĄ uma Ășnica versĂŁo defn dynamic
que Ă© usada independentemente do tipo dePet
que Ă© passado. -
Quando se usa
dyn Trait
, o objeto de trait precisa estar atrĂĄs de algum tipo de indireção. Neste caso, Ă© uma referĂȘncia, embora tipos de ponteiro inteligente (smart comoBox
também possam ser usados (isso serå demonstrado no dia 3). -
Em tempo de execução, um
&dyn Pet
Ă© representado como um âponteiro gordoâ, ou seja, um par de dois ponteiros: Um ponteiro aponta para o objeto concreto que implementaPet
, e o outro aponta para a tabela de métodos virtuais para a implementação do trait para esse tipo. Ao chamar o métodotalk
em&dyn Pet
, o compilador procura o ponteiro de função paratalk
na tabela de métodos virtuais e então invoca a função, passando o ponteiro para oDog
ouCat
para essa função. O compilador não precisa saber o tipo concreto doPet
para fazer isso. -
Um
dyn Trait
Ă© considerado âapagado de tipoâ, porque nĂŁo temos mais conhecimento em tempo de compilação sobre qual Ă© o tipo concreto.