Programowanie w języku Rust - Helion
Tłumaczenie: Witold Sikorski, Małgorzata Dąbkowska-Kowalik
ISBN: 9788301206390
stron: 608, Format: ebook
Data wydania: 2019-06-14
Księgarnia: Helion
Cena książki: 95,20 zł (poprzednio: 119,00 zł)
Oszczędzasz: 20% (-23,80 zł)
Programowanie w języku Rust to oficjalna książka na temat Rusta: języka programowania na licencji open source, który pozwala nam szybciej pisać niezawodne oprogramowanie. Rust daje możliwość kontrolowania szczegółów niskiego poziomu (jak wykorzystanie pamięci) w połączeniu z ergonomią wysokiego poziomu, eliminując kłopoty tradycyjnie związane z językami niskiego poziomu. W książce Programowanie w języku Rust dwaj członkowie Rust Core Team pokazują, jak w pełni korzystać z właściwości Rusta od instalacji po tworzenie własnych niezawodnych i skalowalnych programów. Zaczynamy od podstaw, takich jak tworzenie funkcji, wybieranie typów danych i wiązanie zmiennych i przechodzimy następnie do bardziej zaawansowanych pojęć takich jak: posiadanie i pożyczanie, czasy życia i cechy bezpieczeństwo pamięci Rusta, które gwarantuje budowanie szybkich, bezpiecznych programów testowanie, obsługa błędów i efektywna refaktoryzacja typy generyczne, inteligentne wskaźniki, wielowątkowość, obiekty cech oraz zaawansowane dopasowywanie wzorców użycie Cargo - wbudowanego w Rust menedżera pakietów, służącego do budowania, testowania i dokumentowania swojego kodu i zarządzania zależnościami używanie zaawansowanego kompilatora Rusta wraz z technikami programowania opartymi na kompilatorze Książka zawiera dużo przykładów kodu, a także trzy rozdziały poświęcone budowaniu gotowych projektów przeznaczonych do sprawdzenia swojej wiedzy: gra w zgadywanie, implementacja narzędzia wiersza poleceń w języku Rust oraz wielowątkowy serwer.
Osoby które kupowały "Programowanie w języku Rust", wybierały także:
- Superinteligencja. Scenariusze, strategie, zagro 66,67 zł, (14,00 zł -79%)
- Poradnik design thinking - czyli jak wykorzysta 48,28 zł, (14,00 zł -71%)
- Kosymulacja. Elastyczne projektowanie i symulacja wielodomenowa 38,39 zł, (11,90 zł -69%)
- F# 4.0 dla zaawansowanych. Wydanie IV 96,45 zł, (29,90 zł -69%)
- Systemy reaktywne. Wzorce projektowe i ich stosowanie 65,31 zł, (20,90 zł -68%)
Spis treści
Programowanie w języku Rust eBook -- spis treści
- Okładka
- Strona tytułowa
- Strona redakcyjna
- O autorach
- Spis treści
- Wstęp
- Podziękowania
- Wprowadzenie
- Dla kogo jest Rust
- Zespoły deweloperskie
- Studenci
- Firmy
- Deweloperzy open source
- Ludzie ceniący szybkość i stabilność
- Dla kogo jest ta książka
- Jak korzystać z tej książki
- Źródła i jak uczestniczyć w tworzeniu tej książki
- Dla kogo jest Rust
- 1. Rozpoczynamy
- Instalacja
- Instalacja rustup w systemach Linux i macOS
- Instalacja rustup w systemie Windows
- Aktualizacja i odinstalowywanie
- Usuwanie błędów
- Lokalna dokumentacja
- Hello, world!
- Tworzenie katalogu projektu
- Pisanie i uruchamianie programu w języku Rust
- Anatomia programu w języku Rust
- Kompilacja i uruchomienie to oddzielne kroki
- Witaj Cargo!
- Tworzenie projektu za pomocą Cargo
- Tworzenie i uruchamianie projektu w Cargo
- Tworzenie gotowej wersji
- Cargo jako konwencja
- Podsumowanie
- Instalacja
- 2. Programowanie zgadywanki
- Tworzenie nowego projektu
- Przetwarzanie odpowiedzi
- Zapisywanie wartości w zmiennych
- Obsługa potencjalnych błędów za pomocą typu Result
- Wyświetlanie wartości za pomocą symboli zastępczych w println!
- Testowanie pierwszej części
- Generowanie tajnej liczby
- Korzystanie ze skrzynki, aby rozszerzyć funkcjonalność
- Generowanie liczby losowej
- Porównanie liczby odgadniętej z tajną
- Dopuszczenie wielu prób za pomocą pętli
- Kończenie programu po poprawnej odpowiedzi
- Obsługa niepoprawnych danych na wejściu
- Podsumowanie
- 3. Typowe pojęcia z zakresu programowania
- Zmienne i mutowalność
- Różnice między zmiennymi a stałymi
- Zasłanianie
- Typy danych
- Typy skalarne
- Typy złożone
- Funkcje
- Parametry funkcji
- Instrukcje i wyrażenia w treści funkcji
- Funkcje z wartościami zwrotnymi
- Komentarze
- Sterowanie przepływem
- Wyrażenie if
- Powtarzanie w pętlach
- Podsumowanie
- Zmienne i mutowalność
- 4. Pojęcie posiadania
- Czym jest posiadanie?
- Reguły posiadania
- Zakres zmiennej
- Typ String
- Pamięć i jej przydział
- Posiadanie i funkcje
- Zwracane wartości i zakres
- Odwołania i pożyczki
- Odwołania mutowalne
- Wiszące odwołania
- Reguły odwołań
- Typ wycinek
- Wycinki łańcucha
- Inne wycinki
- Podsumowanie
- Czym jest posiadanie?
- 5. Używanie struktur do konstruowania powiązanych danych
- Definiowanie struktur i tworzenie ich instancji
- Używanie skrótu do inicjacji pola, gdy zmienne i pola mają takie same nazwy
- Tworzenie instancji z innych instancji za pomocą składni aktualizacji struktury
- Użycie struktur krotki bez nazywanych pól do tworzenia różnych typów
- Struktury jako jednostki bez żadnych pól
- Przykład programu z użyciem struktury
- Refaktoryzacja za pomocą krotek
- Refaktoryzacja za pomocą struktur
- Dodawanie użytecznej funkcjonalności za pomocą wyprowadzonych cech
- Składnia metody
- Definiowanie metod
- Metody z większą liczbą parametrów
- Funkcje powiązane
- Wiele bloków impl
- Podsumowanie
- Definiowanie struktur i tworzenie ich instancji
- 6. Typ wyliczeniowy i dopasowanie wzorca
- Definiowanie wyliczenia
- Wartości wyliczeń
- Wyliczenie Option i jego zalety w porównaniu z wartościami null
- Operator sterowania przepływem match
- Wzorce, które są związane z wartościami
- Dopasowywanie za pomocą Option
- Dopasowania wyczerpują wszystkie przypadki
- Symbol zastępczy _
- Sterowanie przepływem za pomocą if let
- Podsumowanie
- Definiowanie wyliczenia
- 7. Wykorzystanie modułów do porządkowania kodu i jego ponownego wykorzystywania
- mod i Filesystem
- Definicje modułów
- Przenoszenie modułów do innych plików
- Reguły systemów plików modułów
- Sterowanie widocznością za pomocą pub
- Ustawienie funkcji jako publicznej
- Reguły prywatności
- Przykłady prywatności
- Odwoływanie się do nazw w różnych modułach
- Wprowadzanie nazw do zakresu za pomocą słowa kluczowego use
- Wprowadzanie wszystkich nazw do zakresu za pomocą glob
- Użycie super do uzyskiwania dostępu do modułu nadrzędnego
- Podsumowanie
- mod i Filesystem
- 8. Typowe kolekcje
- Przechowywanie list wartości za pomocą wektorów
- Tworzenie nowego wektora
- Uaktualnianie wektora
- Usunięcie wektora usuwa jego elementy
- Czytanie elementów wektora
- Iterowanie po wartościach w wektorze
- Użycie wyliczania do przechowywania wielu typów
- Przechowywanie w łańcuchach tekstu zakodowanego za pomocą UTF-8
- Czym jest łańcuch?
- Tworzenie nowego łańcucha
- Aktualizacja łańcucha
- Indeksowanie łańcuchów
- Dzielenie łańcuchów na wycinki
- Metody iterowania po łańcuchach
- Łańcuchy nie są takie proste
- Przechowywanie kluczy z powiązanymi wartościami w mapach skrótów
- Tworzenie nowej mapy skrótów
- Mapy skrótów a posiadanie
- Dostęp do wartości w mapie skrótów
- Aktualizacja mapy skrótów
- Funkcje skrótu
- Podsumowanie
- Przechowywanie list wartości za pomocą wektorów
- 9. Obsługa błędów
- Błędy nienaprawialne z makrem panic!
- Użycie śladu panic!
- Błędy do naprawienia za pomocą Result
- Dopasowywanie przy różnych błędach
- Skróty do paniki przy błędzie: unwrap i expect
- Propagowanie błędów
- Panikować czy nie panikować
- Przykłady, prototypowy kod i testy
- Przypadki, w których mamy więcej informacji niż kompilator
- Wskazówki dotyczące obsługi błędów
- Tworzenie niestandardowych typów do celów sprawdzania
- Podsumowanie
- Błędy nienaprawialne z makrem panic!
- 10. Typy generyczne, cechy i czasy życia
- Usuwanie duplikacji przez wyodrębnienie funkcji
- Generyczne typy danych
- W definicjach funkcji
- Definicje w strukturze
- W definicjach wyliczeń
- W definicjach metod
- Wydajność kodu z użyciem typów generycznych
- Cechy definiowanie wspólnego zachowania
- Definiowanie cechy
- Implementowanie cechy na typie
- Implementacje domyślne
- Granice cech
- Naprawa funkcji largest za pomocą granic cech
- Używanie granic cech do metod implementowanych warunkowo
- Sprawdzanie odwołań za pomocą czasów życia
- Zapobieganie wiszącym odwołaniom za pomocą czasów życia
- Kontroler pożyczek
- Generyczne czasy życia w funkcjach
- Składnia adnotacji dla czasu życia
- Adnotacje o czasie życia w sygnaturach funkcji
- Myślenie w kategoriach czasów życia
- Adnotacje o czasie życia w definicjach struktur
- Pominięcie czasu życia
- Adnotacje o czasie życia w definicjach metod
- Statyczny czas życia
- Parametry generycznego typu, granice cech i czas życia w połączeniu
- Podsumowanie
- 11. Pisanie automatycznych testów
- Jak pisać testy
- Anatomia funkcji testowania
- Sprawdzanie wyników za pomocą makra assert!
- Testowanie równości za pomocą makr assert_eq! i assert_ne!
- Dodawanie niestandardowych komunikatów
- Testowanie kodu pod kątem paniki za pomocą should_panic
- Sterowanie sposobem uruchamiania testów
- Uruchamianie testów równolegle lub po kolei
- Pokazywanie wyników funkcji
- Uruchomienie podzbioru testów według nazwy
- Pomijanie niektórych testów, jeśli nie zostaną konkretnie wymienione
- Organizacja testów
- Testy jednostkowe
- Testy integracyjne
- Podsumowanie
- Jak pisać testy
- 12. Projekt we/wy budowa programu wiersza poleceń
- Akceptowanie argumentów wiersza poleceń
- Czytanie wartości argumentów
- Zapisywanie wartości argumentów w zmiennych
- Czytanie pliku
- Refaktoryzacja w celu poprawienia modułowości i obsługi błędów
- Oddzielanie problemów w projektach binarnych
- Naprawa obsługi błędów
- Wyodrębnianie kodu z main
- Podział kodu do skrzynki bibliotecznej
- Tworzenie funkcjonalności biblioteki przy użyciu TDD
- Pisanie testu zakończonego niepowodzeniem
- Pisanie testu, który przejdzie
- Praca ze zmiennymi środowiskowymi
- Pisanie testu zakończonego niepowodzeniem dla funkcji nierozróżniających wielkości liter
- Implementacja funkcji search_case_insensitive
- Pisanie komunikatów o błędach do standardowego błędu zamiast standardowego wyjścia
- Sprawdzanie, gdzie są zapisywane błędy
- Zapisywanie błędów do standardowego błędu
- Podsumowanie
- Akceptowanie argumentów wiersza poleceń
- 13. Funkcje języka funkcyjnego: iteratory i zamknięcia
- Zamknięcia anonimowe funkcje, które mogą przechwycić swoje środowisko
- Tworzenie abstrakcji zachowania za pomocą zamknięć
- Wnioskowanie o typie zamknięcia i adnotacje
- Zapisywanie zamknięć z użyciem parametrów generycznych i cech Fn
- Ograniczenia implementacji Cacher
- Przechwytywanie środowiska za pomocą zamknięć
- Przetwarzanie ciągów elementów za pomocą iteratorów
- Cecha Iterator i metoda next
- Metody, które zużywają iterator
- Metody tworzące inne iteratory
- Wykorzystanie zamknięć, które przechwytują swoje środowisko
- Tworzenie własnych iteratorów za pomocą cechy Iterator
- Ulepszanie naszego projektu we/wy
- Usuwanie klonu za pomocą iteratora
- Bardziej przejrzysty kod dzięki adapterom iteratora
- Porównywanie wydajności pętle a iteratory
- Podsumowanie
- Zamknięcia anonimowe funkcje, które mogą przechwycić swoje środowisko
- 14. Więcej informacji o Cargo i Crates.io
- Wersje niestandardowe z profilami wydania
- Publikacja skrzynki w Crates.io
- Dokonywanie użytecznych komentarzy dokumentujących
- Eksport wygodnego publicznego API za pomocą pub use
- Tworzenie konta Crates.io
- Dodawanie metadanych do nowej skrzynki
- Publikowanie w Crates.io
- Publikowanie nowej wersji istniejącej skrzynki
- Usuwanie wersji z Crates.io za pomocą cargo yank
- Przestrzenie robocze Cargo
- Tworzenie przestrzeni roboczej
- Tworzenie drugiej skrzynki w przestrzeni roboczej
- Instalowanie wersji binarnych z Crates.io za pomocą cargo install
- Rozszerzanie Cargo za pomocą niestandardowych poleceń
- Podsumowanie
- 15. Inteligentne wskaźniki
- Używanie Box do wskazywania danych na kopcu
- Używanie Box do zapisu danych na kopcu
- Włączenie typów rekurencyjnych z pudełkami
- Traktowanie inteligentnych wskaźników jak zwykłych odwołań z cechą Deref
- Podążanie za wskaźnikiem do wartości z użyciem operatora wyłuskiwania
- Używanie Box jak odwołania
- Definiowanie własnego inteligentnego wskaźnika
- Traktowanie typu jak odwołania dzięki implementacji cechy Deref
- Niejawne wymuszanie Deref z funkcjami i metodami
- Jak wymuszanie Deref współdziała z mutowalnością
- Uruchamianie kodu czyszczącego z cechą Drop
- Wczesne odrzucanie wartości z zastosowaniem std::mem::drop
- Rc inteligentny wskaźnik ze zliczaniem odwołań
- Używanie Rc do współdzielenia danych
- Klonowanie Rc zwiększa licznik odwołań
- RefCell oraz wzorzec wewnętrznej mutowalności
- Wymuszanie reguł pożyczania podczas wykonania za pomocą RefCell
- Mutowalność wewnętrzna mutowalne pożyczanie niemutowalnej wartości
- Wielu posiadaczy zmiennych danych dzięki połączeniu Rc i RefCell
- Odwołania cykliczne mogą prowadzić do wycieku pamięci
- Tworzenie odwołań cyklicznych
- Zapobieganie odwołaniom cyklicznym zmiana Rc na Weak
- Podsumowanie
- Używanie Box do wskazywania danych na kopcu
- 16. Współbieżność bez obaw
- Użycie wątków do równoległego uruchamiania kodu
- Tworzenie nowego wątku za pomocą spawn
- Oczekiwanie, aż wszystkie wątki się zakończą, z użyciem JoinHandle
- Korzystanie z zamknięcia move z wątkami
- Używanie przekazywania komunikatów do transferu danych między wątkami
- Kanały i przeniesienie własności
- Wysyłanie wielu wartości i oczekujący nadajnik
- Tworzenie wielu producentów przez klonowanie nadajnika
- Współbieżność ze współdzieleniem zasobów
- Wykorzystanie muteksów w celu zezwolenia na dostęp do danych z jednego wątku naraz
- Podobieństwa między RefCell/Rc a Mutex/Arc
- Elastyczna współbieżność z cechami Sync i Send
- Pozwolenie na przenoszenie posiadania między wątkami za pomocą Send
- Pozwolenie na dostęp z wielu wątków za pomocą Sync
- Ręczne implementowanie Send i Sync nie jest bezpieczne
- Podsumowanie
- Użycie wątków do równoległego uruchamiania kodu
- 17. Własności programowania obiektowego w języku Rust
- Charakterystyka języków obiektowych
- Obiekty zawierają dane i działanie
- Enkapsulacja, która ukrywa szczegóły implementacji
- Dziedziczenie jako system typów i jako współdzielenie kodu
- Wykorzystywanie obiektów cech, które dopuszczają wartości różnych typów
- Definiowanie cechy dla jednolitego zachowania
- Implementowanie cechy
- Obiekty cech wykonują dynamiczne wysyłki
- Bezpieczeństwo obiektowe jest wymagane dla obiektów cech
- Implementowanie wzorca projektu obiektowego
- Definiowanie postu i tworzenie nowej instancji w stanie Draft
- Przechowywanie tekstu treści postu
- Gwarantowanie, że treść projektu postu jest pusta
- Żądanie oceny postu zmienia jego stan
- Dodawanie metody approve, która zmienia zachowanie treści
- Kompromisy wzorca stanu
- Podsumowanie
- Charakterystyka języków obiektowych
- 18. Wzorce i dopasowywanie
- Wszystkie miejsca, w których można korzystać ze wzorców
- Gałęzie match
- Wyrażenia warunkowe if let
- Warunkowe pętle while let
- Pętle for
- Instrukcja let
- Parametry funkcji
- Podważalność czy dopasowanie do wzorca może się nie udać
- Składnia wzorca
- Dopasowywanie literałów
- Dopasowywanie nazwanych zmiennych
- Wiele wzorców
- Dopasowywanie zakresów wartości za pomocą składni ...
- Destrukturyzacja w celu rozdzielenia wartości
- Pomijanie wartości we wzorcu
- Tworzenie odwołań we wzorcach za pomocą ref i ref mut
- Dodatkowe instrukcje warunkowe ze strażnikami dopasowania
- Wiązania @
- Podsumowanie
- Wszystkie miejsca, w których można korzystać ze wzorców
- 19. Funkcje zaawansowane
- Niebezpieczny Rust
- Niebezpieczne super możliwości
- Wyłuskiwanie pierwotnego wskaźnika
- Wywoływanie niebezpiecznej funkcji lub metody
- Uzyskiwanie dostępu do modyfikowalnej zmiennej statycznej lub jej modyfikowanie
- Implementacja niebezpiecznej cechy
- Kiedy korzystać z kodu, który nie jest bezpieczny
- Zaawansowane czasy życia
- Podtypy czasów życia jako gwarancja, że jeden czas życia jest dłuższy od innego
- Granice czasu życia w odwołaniach do typów generycznych
- Wnioskowanie o czasach życia obiektów cech
- Zaawansowane cechy
- Określanie typów symboli zastępczych w definicjach cech z powiązanymi typami
- Domyślne parametry typów generycznych i przeciążenie operatora
- Składnia w pełni kwalifikowana dla jednoznaczności wywoływanie metod z taką samą nazwą
- Użycie super cech, aby wymagać funkcjonalności jednej cechy wewnątrz innej cechy
- Użycie wzorca newtype do implementacji zewnętrznych cech na zewnętrznych typach
- Typy zaawansowane
- Użycie wzorca newtype dla bezpieczeństwa typów i abstrakcji
- Tworzenie synonimów typu z aliasami typów
- Typ nigdy, który nigdy niczego nie zwraca
- Typy o dynamicznie określanych rozmiarach i cecha Sized
- Zaawansowane funkcje i zamknięcia
- Wskaźniki funkcji
- Zwracanie zamknięć
- Podsumowanie
- Niebezpieczny Rust
- 20. Ostatni projekt budowanie wielowątkowego serwera WWW
- Budowanie jednowątkowego serwera WWW
- Nasłuchiwanie połączeń TCP
- Czytanie żądania
- Bliższe spojrzenie na żądanie HTTP
- Pisanie odpowiedzi
- Zwracanie rzeczywistego HTML
- Sprawdzanie poprawności żądania i selektywne odpowiadanie
- Nieco refaktoryzacji
- Zamiana serwera jednowątkowego na wielowątkowy
- Symulowanie powolnego żądania w bieżącej implementacji serwera
- Poprawienie przepustowości za pomocą puli wątków
- Płynne zakończenie i czyszczenie
- Implementacja cechy Drop na ThreadPool
- Sygnalizowanie wątkom, aby przestały nasłuchiwać zadań
- Podsumowanie
- Budowanie jednowątkowego serwera WWW
- A. Słowa kluczowe
- Słowa kluczowe obecnie stosowane
- Słowa kluczowe zarezerwowane do użycia w przyszości
- B. Operatory i symbole
- Operatory
- Symbole inne niż operatory
- C. Cechy wyprowadzone
- Debugowanie wyjścia dla programisty
- PartialEq i Eq do porównań równościowych
- PartialOrd i Ord do porównywania kolejności
- Klonowanie i kopiowanie zduplikowanych wartości
- Cecha Hash do odwzorowania wartości na wartość o ustalonym rozmiarze
- Cecha Default dla wartości domyślnych
- D. Makra
- Różnica między makrami a funkcjami
- Makra deklaratywne z macro_rules! do celów ogólnego metaprogramowania
- Makra proceduralne do celów niestandardowych wyprowadzeń
- Przyszłość makr
- Przypisy