Witaj, świecie!
Skoro zainstalowałeś Rusta, czas napisać swój pierwszy program w tym języku.
Tradycyjnie, ucząc się nowego języka, pisze się mały program, który wyświetla
tekst Witaj, świecie! na ekranie, więc zrobimy to samo i tutaj!
Uwaga: Ta książka zakłada podstawową znajomość wiersza poleceń. Rust nie stawia żadnych specyficznych wymagań dotyczących edycji, narzędzi ani miejsca przechowywania kodu, więc jeśli wolisz używać IDE zamiast wiersza poleceń, śmiało korzystaj ze swojego ulubionego IDE. Wiele środowisk IDE ma obecnie pewne wsparcie dla Rusta; sprawdź dokumentację IDE, aby uzyskać szczegółowe informacje. Zespół Rusta skupia się na zapewnieniu doskonałego wsparcia IDE za pośrednictwem
rust-analyzer. Więcej szczegółów znajdziesz w Dodatku D.
Konfiguracja katalogu projektu
Zaczniesz od utworzenia katalogu do przechowywania kodu Rusta. Dla Rusta nie ma znaczenia, gdzie znajduje się Twój kod, ale dla ćwiczeń i projektów w tej książce sugerujemy utworzenie katalogu projects w katalogu domowym i przechowywanie tam wszystkich swoich projektów.
Otwórz terminal i wprowadź następujące polecenia, aby utworzyć katalog projects i katalog dla projektu „Witaj, świecie!” w katalogu projects.
Na Linuksie, macOS i w PowerShell na Windows, wprowadź:
$ mkdir ~/projects
$ cd ~/projects
$ mkdir hello_world
$ cd hello_world
W systemie Windows CMD wprowadź:
> mkdir "%USERPROFILE%\projects"
> cd /d "%USERPROFILE%\projects"
> mkdir hello_world
> cd hello_world
Podstawy programu w Ruście
Następnie utwórz nowy plik źródłowy i nazwij go main.rs. Pliki Rusta zawsze kończą się rozszerzeniem .rs. Jeśli używasz więcej niż jednego słowa w nazwie pliku, konwencją jest używanie podkreślenia do ich rozdzielania. Na przykład użyj hello_world.rs zamiast helloworld.rs.
Teraz otwórz nowo utworzony plik main.rs i wprowadź kod z Listingu 1-1.
fn main() {
println!("Hello, world!");
}
Zapisz plik i wróć do okna terminala w katalogu ~/projects/hello_world. Na Linuksie lub macOS wprowadź następujące polecenia, aby skompilować i uruchomić plik:
$ rustc main.rs
$ ./main
Hello, world!
Na Windows wprowadź polecenie .\main zamiast ./main:
> rustc main.rs
> .\main
Hello, world!
Niezależnie od systemu operacyjnego, w terminalu powinno pojawić się
Witaj, świecie!. Jeśli nie widzisz tego wyjścia, wróć do części „Rozwiązywanie
problemów” w sekcji Instalacja, aby uzyskać pomoc.
Jeśli Witaj, świecie! zostało wypisane, gratulacje! Oficjalnie napisałeś
program w Ruście. To czyni Cię programistą Rusta – witaj!
Anatomia programu w Ruście
Przejrzyjmy szczegółowo ten program „Witaj, świecie!”. Oto pierwszy element układanki:
fn main() {
}
Te wiersze definiują funkcję o nazwie main. Funkcja main jest specjalna:
Zawsze jest pierwszym kodem, który jest uruchamiany w każdym wykonywalnym
programie w Ruście. Tutaj pierwszy wiersz deklaruje funkcję o nazwie main,
która nie ma parametrów i nic nie zwraca. Gdyby były parametry, znalazłyby się
w nawiasach ().
Ciało funkcji jest ujęte w {}. Rust wymaga nawiasów klamrowych wokół
wszystkich ciał funkcji. Dobrym stylem jest umieszczanie otwierającego nawiasu
klamrowego w tym samym wierszu co deklaracja funkcji, dodając jeden odstęp
pomiędzy nimi.
Uwaga: Jeśli chcesz trzymać się standardowego stylu w projektach Rusta, możesz użyć automatycznego narzędzia formatującego o nazwie
rustfmtdo formatowania kodu w określonym stylu (więcej orustfmtw Dodatku D). Zespół Rusta dołączył to narzędzie do standardowej dystrybucji Rusta, podobnie jakrustc, więc powinno być już zainstalowane na Twoim komputerze!
Ciało funkcji main zawiera następujący kod:
#![allow(unused)]
fn main() {
println!("Hello, world!");
}
Ten wiersz wykonuje całą pracę w tym małym programie: wyświetla tekst na ekranie. Należy zwrócić uwagę na trzy ważne szczegóły.
Po pierwsze, println! wywołuje makro Rusta. Gdyby wywoływało funkcję, byłoby
wpisane jako println (bez !). Makra Rusta to sposób na pisanie kodu, który
generuje kod w celu rozszerzenia składni Rusta, a omówimy je bardziej
szczegółowo w Rozdziale 20. Na razie wystarczy
wiedzieć, że użycie ! oznacza wywołanie makra zamiast normalnej funkcji, a
makra nie zawsze przestrzegają tych samych zasad co funkcje.
Po drugie, widzisz ciąg znaków "Hello, world!". Przekazujemy ten ciąg jako
argument do println!, a ciąg jest wyświetlany na ekranie.
Po trzecie, kończymy wiersz średnikiem (;), co oznacza, że to wyrażenie
zostało zakończone, a następne jest gotowe do rozpoczęcia. Większość wierszy
kodu Rusta kończy się średnikiem.
Kompilacja i wykonanie
Właśnie uruchomiłeś nowo utworzony program, więc przyjrzyjmy się każdemu krokowi w tym procesie.
Przed uruchomieniem programu w Ruście musisz go skompilować za pomocą
kompilatora Rusta, wpisując polecenie rustc i podając nazwę pliku źródłowego,
w ten sposób:
$ rustc main.rs
Jeśli masz doświadczenie z C lub C++, zauważysz, że jest to podobne do gcc
lub clang. Po pomyślnej kompilacji Rust wypisuje plik wykonywalny.
Na Linuksie, macOS i w PowerShell na Windows, możesz zobaczyć plik wykonywalny,
wpisując polecenie ls w swojej powłoce:
$ ls
main main.rs
Na Linuksie i macOS zobaczysz dwa pliki. W PowerShell na Windows zobaczysz te same trzy pliki, które zobaczyłbyś używając CMD. W CMD na Windows wypisałbyś następujące polecenie:
> dir /B %= opcja /B wyświetla tylko nazwy plików =%
main.exe
main.pdb
main.rs
Pokazuje to plik kodu źródłowego z rozszerzeniem .rs, plik wykonywalny (main.exe na Windows, ale main na wszystkich innych platformach) oraz, w przypadku używania Windows, plik zawierający informacje debugowania z rozszerzeniem .pdb. Stąd uruchamiasz plik main lub main.exe, w ten sposób:
$ ./main # lub .\main na Windows
Jeśli twój main.rs to program „Witaj, świecie!”, ten wiersz wypisze Witaj, świecie! w twoim terminalu.
Jeśli jesteś bardziej zaznajomiony z językami dynamicznymi, takimi jak Ruby, Python lub JavaScript, możesz nie być przyzwyczajony do kompilowania i uruchamiania programu jako oddzielnych kroków. Rust jest językiem kompilowanym z wyprzedzeniem, co oznacza, że możesz skompilować program i przekazać plik wykonywalny komuś innemu, a ta osoba może go uruchomić nawet bez zainstalowanego Rusta. Jeśli przekażesz komuś plik .rb, .py lub .js, ta osoba musi mieć zainstalowaną (odpowiednio) implementację Ruby, Pythona lub JavaScriptu. Ale w tych językach potrzebujesz tylko jednego polecenia, aby skompilować i uruchomić program. Wszystko jest kompromisem w projektowaniu języka.
Samo kompilowanie za pomocą rustc jest wystarczające dla prostych programów,
ale w miarę rozrostu projektu będziesz chciał zarządzać wszystkimi opcjami i
ułatwić udostępnianie kodu. Następnie przedstawimy narzędzie Cargo, które pomoże
Ci pisać rzeczywiste programy w Ruście.