Słowo kluczowe public
Część sekcji Programowanie obiektowe ścieżki Rust w Coddy. Lekcja 9 z 61.
W poprzedniej lekcji nauczyłeś się organizować kod w osobnych plikach modułów. Jeśli jednak spróbujesz użyć struktury Player z pliku main.rs, napotkasz błąd kompilatora. Dzieje się tak, ponieważ wszystko w module Rust jest domyślnie prywatne.
Aby elementy były dostępne spoza ich modułu, musisz jawnie oznaczyć je słowem kluczowym pub:
// player.rs
pub struct Player {
pub name: String,
pub score: u32,
}
impl Player {
pub fn new(name: String) -> Player {
Player { name, score: 0 }
}
}
Zwróć uwagę, że pub pojawia się w kilku miejscach: przy samej strukturze, przy każdym polu i przy metodzie. Każdy element wymaga własnej deklaracji widoczności.
Bez pub przy strukturze inne pliki nie mogą nawet odwołać się do typu. Bez pub przy polach nie mogą uzyskać bezpośredniego dostępu do danych. Bez pub przy metodach nie mogą ich wywoływać.
Teraz w pliku main.rs możesz używać publicznych elementów modułu:
// main.rs
mod player;
use player::Player;
fn main() {
let p = Player::new(String::from("Alice"));
println!("{}", p.name);
}
Instrukcja use wprowadza Player do zakresu, dzięki czemu nie musisz za każdym razem pisać player::Player. To podejście, w którym domyślnie wszystko jest prywatne, jest celowe. Zachęca cię do uważnego zastanowienia się, które części twojego kodu powinny być udostępnione światu zewnętrznemu.
Wyzwanie
ŁatwyZbudujmy prosty katalog produktów, organizując kod w dwóch plikach i udostępniając odpowiednie elementy, aby można było z nich korzystać w programie głównym.
Utworzysz dwa pliki:
product.rs: Zdefiniuj strukturęProductz dwoma polami:name(String) iprice(f64). Dodaj funkcję skojarzoną o nazwienew, która przyjmuje nazwę i cenę, a następnie zwraca nowy elementProduct. Pamiętaj, aby oznaczyć strukturę, jej pola i metodę jako publiczne, żeby można było uzyskać do nich dostęp spoza modułu.main.rs: Zadeklaruj moduł product, wprowadźProductdo zakresu za pomocą instrukcjiuse, a następnie utwórz produkt i wyświetl jego szczegóły.
Zastanów się dokładnie, gdzie potrzebujesz słowa kluczowego pub: sama struktura musi być widoczna, pola muszą być dostępne do odczytu, a metoda konstruktora musi być możliwa do wywołania z main.rs.
Wynik powinien mieć dokładnie następujący format:
Product: {name}, Price: ${price}Na przykład, jeśli utworzysz produkt o nazwie "Laptop" i cenie 999.99, wynik będzie następujący:
Product: Laptop, Price: $999.99Otrzymasz dwa dane wejściowe: nazwę produktu i jego cenę.
Spróbuj swoich sił
// Zadeklaruj moduł product
mod product;
// TODO: Wprowadź Product do zasięgu za pomocą instrukcji use
fn main() {
// Odczytaj dane wejściowe
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: Utwórz nowy obiekt Product za pomocą funkcji Product::new
// TODO: Wyświetl szczegóły produktu w formacie:
// Produkt: {name}, Cena: ${price}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Metody i zachowanie
Wprowadzenie do bloków implementacjiParametr selfMetody modyfikująceFunkcje powiązaneWiele bloków implementacjiŁańcuchowe wywoływanie metodPowtórzenie — działania na prostokącie4Projekt: Wirtualne zwierzątko
Definiowanie zwierzątkaKarmienie zwierzątka7Standardowe cechy
Cecha DebugCecha DisplayClone i CopyCechy równościPowtórka – punkt do wydrukowania10Projekt: System dokumentów
Trait DrawKomponent tekstowy2Hermetyzacja i moduły
Podstawy modułówSłowo kluczowe publicPola prywatneGetterySetteryPodsumowanie — bezpieczna skrytka5Typy generyczne
Struktury generyczneMetody generyczneWiele typów generycznychFunkcje generycznePodsumowanie – punkt współrzędnych8Cechy jako ograniczenia
Składnia ograniczeń cechWiele ograniczeńKlauzula whereZwracanie typów z użyciem cechPodsumowanie — generyczna drukarka11Wzorce projektowe w Rust
Wzorzec NewtypeKompozycjaTrait DropFrom i IntoPodsumowanie — atrapowy inteligentny wskaźnik3Zaawansowane typy wyliczeniowe
Typy wyliczeniowe z danymiMetody typów wyliczeniowychDopasowywanie wariantów danychTyp wyliczeniowy Option — powtórzeniePodsumowanie — typ wyliczeniowy Shape6Definiowanie cech
Czym jest cecha?Implementowanie cechImplementacje domyślneNadpisywanie wartości domyślnychCechy z parametramiPowtórzenie — odtwarzacz multimedialnyPoćwicz samodzielnie: Kompilator Rust online