- ,
- Rust onderscheidt zich door zijn beveiliging, prestaties en efficiënte geheugenbeheer.
- Eigenaarschap en veranderlijkheid zijn essentieel om veelvoorkomende fouten te voorkomen.
- Het ecosysteem omvat tools zoals Cargo en een community met praktische bronnen.
- Met Rust kunt u alles maken, van eenvoudige scripts tot robuuste platformonafhankelijke systemen.
Het ontdekken van Rust kan een heel avontuur zijn voor wie op zoek is naar een taal die prestaties, beveiliging en onberispelijk geheugenbeheer combineert., zonder in te leveren op gebruiksgemak. In dit artikel duiken we in de fascinerende wereld van Rust, leggen we de basisprincipes en de belangrijkste sterke en zwakke punten uit, en laten we praktische voorbeelden zien, zodat je er vanaf dag één het maximale uit kunt halen.
Hoewel het op het eerste gezicht misschien op andere systeemtalen lijkt, zoals C of C++, maakt Rust een sterke entree dankzij zijn moderne aanpak van aanwezigheid en beveiligingHet is ideaal voor zowel beginners als ervaren ontwikkelaars die hoofdpijn door geheugenfouten of race-omstandigheden willen voorkomen.
Wat is Rust en waarom wordt het zo populair?
Roest is een taal van programmering van systemen waarvan het hoofddoel is om een evenwicht te bieden tussen veiligheid, snelheid en aanwezigheid. Het is ontstaan met het idee om veelvoorkomende fouten in andere, vergelijkbare talen te elimineren, zoals de vervelende Null-pointers, geheugenlekken en raceomstandigheden die vaak in gelijktijdige omgevingen ontstaan.
Velen beschouwen het als de natuurlijke opvolger van C en C++, maar met een moderne syntaxis, een levendig ecosysteem en een radicale focus op betrouwbaarheid del softwareHet wordt gebruikt door bedrijven als Mozilla, Dropbox, Cloudflare, Canonical en nog veel meer voor systemen en applicatieprojecten met hoge prestaties.
Dit zijn de belangrijkste Roest differentiële waarden:
- Geheugenbeheer zonder garbage collection: Dankzij het eigendomssysteem en de strenge leenregels worden veelvoorkomende geheugenproblemen vermeden, zonder dat er een opdringerige garbage collector aan te pas komt.
- Veilige en efficiënte gelijktijdigheid: De compiler zorgt ervoor dat er geen race-omstandigheden ontstaan, waardoor multitasking eenvoudiger wordt.
- Snelheid vergelijkbaar met C/C++: Bij compilatie en aansturing door geheugentoewijzing worden snelle en efficiënte binaire bestanden verkregen.
- Robuust en statisch typesysteem: Het detecteert veel fouten tijdens het compileren, waardoor het onderhoud en de ontwikkeling van projecten eenvoudiger worden.
Rust is open source en heeft een zeer actieve community, met een overvloed aan bronnen zoals tutorials, boeken, forums en lezingen voor alle niveaus.
De ontwikkelomgeving installeren en configureren
Aan de slag gaan met Rust is heel eenvoudig. De aanbevolen methode voor het installeren van de taal en de basistools is: roestMet dit installatieprogramma kunt u de nieuwste stabiele versie van Rust downloaden, samen met roestc (compiler) en Cargo (pakketbeheerder en projectbouw).
Op GNU/Linux of MacOS-systemen, voer gewoon de volgende opdracht uit in de terminal:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sch
En Windows U kunt het uitvoerbare bestand rustup-init.exe downloaden van de officiële website en de installatiewizard volgen.
Om te controleren of de installatie succesvol is, voert u het volgende uit:
rustc --versie
Dit toont de geïnstalleerde versie van de Rust-compiler. Als je problemen ondervindt, vooral op macOS, kun je controleren of je de Xcode-ontwikkeltools hebt geïnstalleerd met:
xcode-select --install
Er zijn er ook extensies voor IDE's de populairste, zoals VS Code, IntelliJ IDEA, Emacs en Nano, waarmee u eenvoudig Rust-code kunt bewerken, automatisch kunt aanvullen en kunt debuggen.
Belangrijkste hulpmiddelen: rustup, rustc en Cargo
Zodra de omgeving klaar is, is het handig om de belangrijkste tools die standaard in Rust zijn opgenomen:
- roest: Beheert verschillende Rust-versies en updatekanalen (stabiel, bèta, nachtelijk). Hiermee kunt u eenvoudig versies installeren, bijwerken en ertussen schakelen.
- rustc: is de Rust-compiler. Deze zet broncode (.rs) om in uitvoerbare binaire bestanden. Deze kan rechtstreeks of via Cargo worden aangeroepen.
- Positie: Het is het hart van het Rust-ecosysteem en beheert projectbuilds, afhankelijkheden (crates), tests, documentatie en meer. Het wordt vanaf dag één je beste vriend.
Om een nieuw project te maken, is de gebruikelijke opdracht:
vracht nieuw mijn_project
Hiermee wordt een standaard directory- en bestandsstructuur gegenereerd, inclusief het manifest. charge.toml en een hoofdbronbestand bron/hoofd.rs. Deze laatste hoeft u alleen maar met uw code te bewerken.
Om het project te compileren en uit te voeren, gebruikt u:
cargo build # Bouw het project (binair in target/debug/) cargo run # Bouw en voer het resulterende binaire bestand uit
Syntactische basisprincipes en structuur van een Rust-programma
La basisstructuur van een programma in Rust Het is eenvoudig en zal bekend voorkomen bij degenen die met andere gecompileerde talen hebben gewerkt. Laten we eens kijken hoe de klassieke "Hello World" eruit zou zien:
fn main() { println!("Hallo wereld!"); }
De belangrijkste functie: fn hoofd() is het instappunt. Het symbool ! na println geeft aan dat het een macro is (een speciale functie van Rust voor code genereren). De puntkomma ; Maak de instructies af.
De broncode bevindt zich meestal in bestanden met een extensie .rs en de syntaxis doet denken aan andere systeemtalen.
Variabelen, constanten en veranderlijkheid
In Rust zijn alle variabelen onveranderlijk standaardDat wil zeggen dat zodra een waarde is toegewezen, deze niet meer kan worden gewijzigd, tenzij expliciet anders aangegeven. Dit voorkomt veel fouten en maakt de code voorspelbaarder.
Om een variabele te declareren die u gebruikt laten:
laat x = 10; // x = 20; // Dit zou mislukken omdat x onveranderlijk is
Als u wilt dat een variabele kan worden gewijzigd, geeft u dit aan met mut:
laat mut x = 10; x = 20; // Nu is het legaal
De constanten worden gedefinieerd met const en moet een expliciet type hebben, waarbij volgens conventie hoofdletters voor de naam worden gebruikt:
constante MAX_SIZE: i32 = 100;
Dit zorgt voor robuustere en beter onderhoudbare code.
Gegevenstypen: scalair en samengesteld
Roest heeft een grote verscheidenheid aan primitieve typen, zowel scalair als samengesteld. Laten we de belangrijkste eens bekijken:
- Getekende gehele getallen: i8, i16, i32, i64, i128, formaat
- Ongetekende gehele getallen: u8, u16, u32, u64, u128, gebruiksgrootte
- Drijvende komma: f32, f64 (de standaardwaarde voor decimalen is f64)
- Karakters: char (ondersteunt volledige Unicode)
- Booleaanse getallen: bool (waar of onwaar)
- Het eenheidstype: () (vergelijkbaar met void in andere talen)
Voor collecties hebben wij beschikbaar tupels y arrays:
- Tupels: Hiermee kunt u waarden van verschillende typen groeperen en ze op positie benaderen:
laat tuple = (1, "tekst", true); laat eerste = tuple.0; // 1
- arrays: Ze slaan meerdere waarden van hetzelfde type gegroepeerd op. De grootte moet worden opgegeven:
laat array: [i32; 3] = [10, 20, 30];
Arrays hebben een vaste grootte en nemen aaneengesloten geheugen in beslag, wat de prestaties verbetert.
Geheugenbeheer: stack en heap
Rust maakt een duidelijk onderscheid tussen stapel- en heapgeheugenStandaard worden gegevens met een bekende, vaste grootte op de stack opgeslagen, terwijl gegevens die een dynamische grootte vereisen (zoals vectoren) op de heap worden opgeslagen.
Het grote verschil met andere talen zoals C is dat Rust een eigendomssysteem (eigenschap), waardoor het niet langer nodig is om het geheugen handmatig te beheren, maar dan zonder garbage collector.
Basisvoorbeeld van een stack en heap:
laat x = 5; // x wordt opgeslagen op de stapel laat v = vec![1, 2, 3]; // v (referentie en metadata) op de stapel, data op de heap
Het eigendoms-, leen- en levensduursysteem
Het hart van geheugenbeheer in Rust is de eigendomssysteemElke waarde heeft één eigenaar; wanneer deze buiten bereik raakt, wordt het geheugen automatisch vrijgegeven. Laten we eens kijken naar een voorbeeld:
laat s1 = String::from("hello"); laat s2 = s1; // println!("{}", s1); // Fout: s1 is niet langer geldig, het eigendom is overgedragen aan s2
Als we willen dat beide variabelen geldig zijn, moeten we een diepe kopie:
laat s1 = String::from("hello"); laat s2 = s1.clone(); // Nu zijn beide onafhankelijk
Wanneer een functie een waarde als parameter accepteert, neemt deze standaard de eigenaarschap over:
fn take_ownership(s: String) { println!("{}", s); } let my_string = String::from("owner"); take_ownership(my_string); // println!("{}", my_string); // Fout, eigendom overgedragen
Om dit te voorkomen worden ze gebruikt referenties (&), waardoor tijdelijke toegang tot de waarde mogelijk wordt:
fn lees_referentie(s: &String) { println!("{}", s); }
Als we de waarde willen wijzigen, moeten we veranderlijke verwijzingen gebruiken (&mut), en respecteer de regel dat er slechts één veranderlijke verwijzing tegelijk kan zijn, of meerdere onveranderlijke verwijzingen.
Macro's en functies in Rust
Met Rust kunt u functies duidelijk en eenvoudig definiëren. Het sleutelwoord fn begint de definitie. Als een functie een waarde retourneert, plaats dan de expressie (zonder puntkomma) aan het einde:
fn som(a: i32, b: i32) -> i32 { a + b }
Een speciale functie in Rust is de macro's, geïdentificeerd met !. Bijvoorbeeld afdrukken! om naar de console af te drukken. Ze maken codegeneratie tijdens compilatie mogelijk en zijn vooral handig voor het automatiseren van repetitieve taken.
Structuren (structs) en opsommingen (enums)
De structuren Met Rust kunt u aangepaste gegevenstypen maken:
struct Positie { x: i32, y: i32, } laat punt = Positie { x: 10, y: 20 };
Structuren kunnen worden gecreëerd tuple-structuren (naamloze velden) of structuren met benoemde velden. Bovendien toevoegen cafe naar de velden, deze worden buiten de huidige module openbaar gemaakt.
De opsommingen Hiermee kunt u een type definiëren dat uit meerdere varianten kan bestaan, zelfs met bijbehorende gegevens:
enum Actie { Springen, Verplaatsen { x: i32, y: i32 }, Zeg(String), } laat springen = Actie::Springen; laat mov = Actie::Verplaatsen { x: 5, y: 10 }; laat spreken = Actie::Zeg(String::from("Hallo!"));
De optie-enum en veilige verwerking van optionele waarden
In Roest nul bestaat nietIn plaats daarvan, de enum-optie om uit te drukken of een waarde aanwezig kan zijn (Sommige(waarde)) of afwezig (Geen):
laat getal = Some(42); laat niets: Optie = None;
Om met Option te werken moet je de waarde uitpakken met methoden zoals uitpakken() (pas op, het kan mislukken op None) of unwrap_or(standaardwaarde)Nog beter is het om te gebruiken patroonafstemming om alle gevallen te dekken:
matchnummer { Some(n) => println!("De waarde is {}", n), None => println!("Er is geen waarde"), }
Patroonherkenning en stroomregeling
El patroonafstemming Het is een van de juweeltjes van Rust, waarmee u veilig en overzichtelijk verschillende mogelijkheden met de operator kunt afhandelen. match:
enum Aanval { Stoot, Zwaard, Speer, Magie, } laat aanval = Aanval::Zwaard; laat schade = match aanval { Aanval::Stoot => 5, Aanval::Zwaard => 12, Aanval::Speer => 8, Aanval::Magie => 20, };
Er is ook een lichtere syntaxis met als laat, nuttig wanneer slechts één specifiek geval van belang is:
als laat Some(waarde) = optie { println!("Huidige waarde: {}", waarde); }
Methoden, bijbehorende functies en sluitingen
Het gebruik van het trefwoord impl Je kunt methoden en bijbehorende functies toevoegen aan structs en enums. Bijvoorbeeld:
struct Punt { x: i64, y: i64, } impl Punt { fn new(x: i64, y: i64) -> Zelf { Zelf { x, y } } fn move_to(&mut zelf, andere: Punt) { zelf.x = andere.x; zelf.y = andere.y; } }
De sluitingen of anonieme functies stellen u in staat omgevingsvariabelen vast te leggen. Ze worden gedefinieerd met |parameters|:
laat factor = 10; laat per_factor = |x: i32| x * factor; laat resultaat = per_factor(5); // 50
Automatisch testen in Rust
Rust is uitgerust met een systeem van geïntegreerde testsHiermee kunt u testfuncties naast productiecode maken:
fn add(a: i32, b: i32) -> i32 { a + b } #[cfg(test)] mod tests { gebruik super::*; #[test] fn basic_sum() { assert_eq!(sum(2, 3), 5); } }
Om ze uit te voeren, typt u eenvoudigweg:
vrachttest
Hiermee worden alle tests uitgevoerd en worden de resultaten in de console weergegeven. Zo kunt u fouten detecteren voordat deze in de productiefase terechtkomen.
Hulpbronnen voor het leren van Rust en interactieve voorbeelden
Als je Rust praktisch wilt leren gebruiken, zijn er talloze officiële en community-bronnen:
- De Rust-programmeertaal: het officiële, gratis en bijgewerkte boek, stap voor stap gids van de basis tot complete projecten.
- Interactieve codevoorbeelden: Platformen zoals Comprehensive Rust bieden u de mogelijkheid om in de browser zelf te experimenteren en voorbeelden te bewerken. Hierdoor kunt u makkelijker leren, zonder dat u iets anders hoeft te installeren dan de compiler.
- Praktische oefeningen: Veel hedendaagse tutorials richten zich op leren door te doen, van consoleprojecten tot het maken van kleine webapplicaties en automatiseringsscripts.
- Forums en gemeenschappen: De Rust-community is erg actief, met ruimtes speciaal voor het beantwoorden van vragen, codebeoordelingen en evenementen zoals meetups en conferenties.
Interactieve voorbeelden bevatten vaak codeblokken zoals:
fn main() { println!("Bewerk mij!"); }
Het is de moeite waard om gebruik te maken van deze interactieve omgevingen, waarin u zonder angst de code kunt testen en aanpassen en direct de resultaten kunt bekijken.
Roest in het huidige ecosysteem: integratie en use cases
Rust is niet alleen voor consoletoepassingen. Steeds meer bedrijven en particulieren gebruiken het voor embedded systemen en integraties met andere talen (zoals Node.js via Neon of Python met PyO3), back-end webontwikkeling (met frameworks zoals Rocket of Actix) en zelfs voor de creatie van besturingssystemen compleet.
Toonaangevende bedrijven en organisaties, zoals Mozilla en Dropbox, hebben gekozen voor Rust voor bedrijfskritische projecten. Zij hechten vooral waarde aan de betrouwbaarheid, preventie van runtime-fouten en de uitstekende prestaties.
De mogelijkheid om te compileren voor meerdere architecturen en platforms, samen met een door Cargo beheerd afhankelijkheidssysteem en benijdenswaardige documentatie, maken Rust een veelzijdige optie voor alle soorten ontwikkeling.
Gepassioneerd schrijver over de wereld van bytes en technologie in het algemeen. Ik deel mijn kennis graag door te schrijven, en dat is wat ik in deze blog ga doen: je de meest interessante dingen laten zien over gadgets, software, hardware, technologische trends en meer. Mijn doel is om u te helpen op een eenvoudige en onderhoudende manier door de digitale wereld te navigeren.