A Palavra-chave Public
Parte da seção Programação Orientada a Objetos do Journey de Rust da Coddy. Lição 9 de 61.
Na lição anterior, você aprendeu a organizar o código em arquivos de módulo separados. No entanto, se tentasse usar a struct Player de main.rs, encontraria um erro do compilador. Isso acontece porque tudo em um módulo Rust é privado por padrão.
Para tornar os itens acessíveis de fora do módulo, você deve marcá-los explicitamente com a palavra-chave pub:
// player.rs
pub struct Player {
pub name: String,
pub score: u32,
}
impl Player {
pub fn new(name: String) -> Player {
Player { name, score: 0 }
}
}
Observe como pub aparece em vários lugares: na própria struct, em cada campo e no método. Cada item precisa de sua própria declaração de visibilidade.
Sem pub na estrutura, outros arquivos nem podem nomear o tipo. Sem pub nos campos, eles não podem acessar os dados diretamente. Sem pub nos métodos, eles não podem chamá-los.
Agora, em main.rs, você pode usar os itens públicos do módulo:
// main.rs
mod player;
use player::Player;
fn main() {
let p = Player::new(String::from("Alice"));
println!("{}", p.name);
}
A instrução use traz Player para o escopo, para que você não precise escrever player::Player todas as vezes. Essa abordagem de privacidade por padrão é intencional. Ela incentiva você a pensar cuidadosamente sobre quais partes do seu código devem ser expostas ao mundo exterior.
Desafio
FácilVamos criar um catálogo de produtos simples organizando seu código em dois arquivos e tornando públicos os itens certos para que possam ser usados no seu programa principal.
Você criará dois arquivos:
product.rs: Defina uma structProductcom dois campos:name(String) eprice(f64). Adicione uma função associada chamadanewque recebe um nome e um preço e retorna um novoProduct. Lembre-se de marcar a struct, seus campos e o método como públicos para que possam ser acessados de fora do módulo.main.rs: Declare o módulo de produto, coloqueProductno escopo com uma instruçãousee, em seguida, crie um produto e imprima seus detalhes.
Pense com cuidado sobre onde você precisa da palavra-chave pub: a própria struct precisa estar visível, os campos precisam estar acessíveis para leitura e o método construtor precisa poder ser chamado de main.rs.
Sua saída deve seguir este formato exato:
Product: {name}, Price: ${price}Por exemplo, se você criar um produto com o nome "Laptop" e o preço 999.99, a saída será:
Product: Laptop, Price: $999.99Você receberá duas entradas: o nome do produto e o preço.
Experimente você mesmo
// Declare o módulo product
mod product;
// TODO: Traga Product para o escopo com uma declaração use
fn main() {
// Leia a entrada
let mut name = String::new();
std::io::stdin().read_line(&mut name).expect("Failed to read line");
let name = name.trim().to_string();
let mut price_input = String::new();
std::io::stdin().read_line(&mut price_input).expect("Failed to read line");
let price: f64 = price_input.trim().parse().expect("Failed to parse price");
// TODO: Crie um novo Product usando a função Product::new
// TODO: Imprima os detalhes do produto no formato:
// Product: {name}, Price: ${price}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
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