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:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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 de fn dynamic que Ă© usada independentemente do tipo de Pet 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 como Box 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 implementa Pet, e o outro aponta para a tabela de mĂ©todos virtuais para a implementação do trait para esse tipo. Ao chamar o mĂ©todo talk em &dyn Pet, o compilador procura o ponteiro de função para talk na tabela de mĂ©todos virtuais e entĂŁo invoca a função, passando o ponteiro para o Dog ou Cat para essa função. O compilador nĂŁo precisa saber o tipo concreto do Pet 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.