Recapitulação - Mock de Smart Pointer
Parte da seção Programação Orientada a Objetos do Journey de Rust da Coddy. Lição 58 de 61.
Desafio
FácilVamos criar um mock de ponteiro inteligente chamado SmartBox que demonstra como os ponteiros inteligentes reais do Rust funcionam internamente! Seu wrapper será genérico, fornecerá acesso ao seu valor interno e anunciará automaticamente quando estiver sendo liberado.
Você organizará seu código em dois arquivos:
smart_box.rs: Defina uma struct genérica públicaSmartBox<T>com um único campovaluedo tipoT. Implemente uma função associadanewque cria um SmartBox e exibe uma mensagem de criação. Adicione um métodogetque retorna uma referência ao valor interno. Por fim, implemente o traitDroppara exibir uma mensagem de limpeza quando o SmartBox sair do escopo.main.rs: Inclua seu módulo smart_box e demonstre seu SmartBox com dois tipos diferentes. Crie umSmartBox<i32>contendo um número e umSmartBox<String>contendo texto (ambos provenientes das entradas fornecidas). Exiba os valores usando seu métodoget. As mensagens de Drop aparecerão automaticamente quando os boxes saírem do escopo no final de main.
Quando um SmartBox for criado, ele deverá exibir:
SmartBox createdAo acessar o valor, exiba-o neste formato:
Value: {value}Quando um SmartBox for descartado, ele deverá exibir:
SmartBox droppedPor exemplo, com as entradas 42 e Hello:
SmartBox created
SmartBox created
Value: 42
Value: Hello
SmartBox dropped
SmartBox droppedObserve como os dois boxes são criados primeiro, depois seus valores são acessados e, por fim, ambos são descartados na ordem inversa (o último criado é o primeiro descartado) quando main termina.
Você receberá duas entradas: um valor inteiro (converta-o para i32) e um valor de string.
Experimente você mesmo
mod smart_box;
use smart_box::SmartBox;
fn main() {
// Lê as entradas
let mut input1 = String::new();
std::io::stdin().read_line(&mut input1).expect("Failed to read line");
let number: i32 = input1.trim().parse().expect("Failed to parse number");
let mut input2 = String::new();
std::io::stdin().read_line(&mut input2).expect("Failed to read line");
let text = input2.trim().to_string();
// TODO: Criar um SmartBox<i32> contendo o número
// TODO: Criar um SmartBox<String> contendo o texto
// TODO: Imprimir os valores usando o método get
// Formato: "Value: {value}"
// As mensagens de Drop aparecerão automaticamente quando main terminar
}
Todas as lições de Programação Orientada a Objetos
1Métodos e Comportamento
Introdução a Blocos de ImplementaçãoO Parâmetro SelfMétodos MutáveisFunções AssociadasMúltiplos Blocos de ImplementaçãoEncadeamento de MétodosRecapitulação - Ações de Retângulo4Projeto: Pet Virtual
Definindo o PetAlimentando o Pet7Traits Padrão
A Trait DebugA Trait DisplayClone e CopyTraits de IgualdadeRecapitulação - Ponto Imprimível10Projeto: Sistema de Documentos
A Trait DrawComponente de Texto2Encapsulamento e Módulos
Fundamentos de MódulosA Palavra-chave PublicCampos PrivadosGettersSettersRecapitulação - Cofre Seguro5Genéricos
Structs GenéricasMétodos GenéricosMúltiplos Tipos GenéricosFunções GenéricasRecapitulação - Ponto de Coordenada8Traits como Restrições
Sintaxe de Restrições de TraitRestrições MúltiplasA Cláusula WhereRetornando Tipos com TraitsRecapitulação - Impressora Genérica11Padrões de Projeto em Rust
Padrão NewtypeComposiçãoA Trait DropFrom e IntoRecapitulação - Mock de Smart Pointer3Enums Avançados
Enums com DadosMétodos em EnumsCorrespondência de Variantes de DadosO Enum Option RevisitadoRecapitulação - Enum Shape6Definição de Traits
O que é uma Trait?Implementando TraitsImplementações PadrãoSobrescrevendo PadrõesTraits com ParâmetrosRecapitulação - Media PlayerPratique por conta própria: Compilador de Rust online