7 skäl att använda rost för ditt nästa utvecklingsprojekt

By rik

Varför välja Rust för dina utvecklingsprojekt?

Är du en utvecklare som funderar på att dyka ner i Rust? Denna artikel utforskar Rusts kärnfunktioner och resurser för att hjälpa dig avgöra om det är rätt val för dig. Rust är ett systemprogrammeringsspråk som blivit alltmer populärt.

Vi kommer att granska dess unika aspekter som typsäkerhet, minneshantering, och ägandesystem, och dessutom ge en lista på verktyg som kan underlätta din inlärningsprocess.

Låt oss utforska Rust!

Vad utmärker Rust?

Rust är ett systemprogrammeringsspråk som initierades som ett personligt projekt av Graydon Hoare 2006. Sedan dess har det utvecklats till ett förstahandsval för systemprogrammering och liknande tillämpningar. En Rust-utvecklare kan förvänta sig en medellön runt 120 000 USD.

Om du överväger att byta från C++ eller söker ett nytt, spännande språk, kan Rust vara ett utmärkt val. Rust har blivit utsett till det mest älskade programmeringsspråket sju år i rad enligt StackOverflows utvecklarundersökning.

Bildkälla: StackOverflow

Rust kombinerar prestandan hos lågnivåspråk som C och C++ med säkerheten hos högnivåspråk som Python.

Rust används flitigt inom en rad områden, från välkända projekt som Dropbox och Firefox, till WebAssembly och inbäddad programmering. Dessutom erbjuder Rust direkt pakethanteringsstöd genom Cargo.

Cargo: Rusts pakethanterare

Cargo är den dedikerade pakethanteraren för Rust. Den låter dig installera paket från ”crates”, Rusts pakethanteringsregister. Utöver att hantera paket, fungerar Cargo även som testverktyg, dokumentgenerator och byggsystem.

Nu när du har en grundläggande förståelse för Rust, låt oss undersöka de funktioner som gör det till ett populärt systemprogrammeringsspråk.

Tydliga felmeddelanden

Som nybörjarprogrammerare kommer du att stöta på fel och spendera tid på felsökning. Rusts kompilator ger detaljerade felmeddelanden och varningar som underlättar processen.

Exempel på felmeddelande

När din kod inte kompileras, ger Rust klara felmeddelanden som förklarar vad som behöver åtgärdas och var felet ligger.

I följande exempel, är variabeln `num2` definierad i funktionen `inner()`, vilket begränsar dess omfattning. Att försöka nå den utanför funktionen ger ett felmeddelande:

        fn main() {
            let num1 = 10;
            fn inner(){
                let num2 = 9; 
            }
            println!("The value of num2 is: {}", num2);
        }
    

Felmeddelandet förklarar tydligt vad som gått fel:

        error[E0425]: cannot find value `num2` in this scope
        --> src/main.rs:6:42
         |
        6 |     println!("The value of num2 is: {}", num2);
         |                                           ^^^^ help: a local variable with a similar name exists: `num1`
      

Varningar under kompilering

Kompilatorn varnar även för potentiella problem i koden. Om du definierar variabler som inte används, ger Rust ett varningsmeddelande.

        fn main() {
            let num1 = 10;
            let num2 = 9;
            println!("The value of num1 is: {}", num1);
        }
    

I det här fallet deklareras variabeln `num2` men används inte.

        warning: unused variable: `num2`
        --> src/main.rs:3:9
         |
        3 |     let num2 = 9;
         |         ^^^^ help: if this is intentional, prefix it with an underscore: `_num2`
         |
    

Stark typning

Rust är ett starkt typat språk, vilket innebär att det inte tillåter automatisk typkonvertering. Detta tvingar dig att vara specifik med datatyper och undvika potentiella fel.

I Python, till exempel, kommer följande kod att köras utan problem, eftersom alla icke-noll tal utvärderas som `True` i ett booleskt sammanhang.

        num1 = 10
        if num1:
            num2 = 9
        print(f"num2 is {num2}")
        # Output: num2 is 9
     

Rust tvingar dig att vara explicit med typer, så samma logik skulle orsaka ett fel:

        fn main() {
            let num1 = 10;
            if num1{
                let num2 = 9; 
            }
        }
    

Rust flaggar felet som en typmismatch, eftersom den förväntar sig ett booleskt värde i `if`-satsen, men hittar ett heltal:

        error[E0308]: mismatched types
        --> src/main.rs:3:8
        |
        3 |     if num1{
        |        ^^^^ expected `bool`, found integer
    

Minnessäkerhet

Minnessäkerhet är en av de mest lockande aspekterna av Rust. Låt oss ge en översikt hur detta fungerar.

Variabler måste initieras

I Rust måste alla variabler ha ett värde innan de används. Till skillnad från C, där en oinitierad variabel kan innehålla skräpvärde, ger Rust ett kompileringsfel om en variabel används utan att ha ett initialt värde.

    #include <stdio.h>

        int main(void) {
            int num;
            printf("The value of num is %d", num);
            return 0;
        }
        // Output: The value of num is 0
    

Om du försöker göra samma sak i Rust får du ett kompileringsfel:

        fn main() {
            let num:i32;
            println!("The value of num is: {}",num);
        }
    
    error[E0381]: used binding `num` isn't initialized
        --> src/main.rs:3:40
         |
        2 |     let num:i32;
         |         --- binding declared here but left uninitialized
        3 |     println!("The value of num is: {}",num);
         |                                         ^^^ `num` used here but it isn't initialized
         |
    

Minnessäkerhet vid kompilering

Rust garanterar minnessäkerhet vid kompilering. Även i fall där logiken kan tyckas uppenbar, kommer Rust att påpeka osäkerheter. I följande kod kommer ett fel uppstå, även om `num` ges ett värde, eftersom kompilatorn inte garanterar att det alltid kommer ske.

        fn main() {
            let num:i32;
            if true{
                num = 100;
            }
            println!("The value of num is: {}", num);
        }
    

Kompilatorn kan inte avgöra att num kommer att vara initialiserat vid kompilering, då ett villkorligt uttryck utvärderas vid körning.

        error[E0381]: used binding `num` is possibly-uninitialized
        --> src/main.rs:6:41
        |
        2 |     let num:i32;
        |         --- binding declared here but left uninitialized
        3 |     if true{
        |        ---- if this `if` condition is `false`, `num` is not initialized
        4 |         num = 100;
        5 |     }
        |      - an `else` arm might be missing here, initializing `num`
        6 |     println!("The value of num is: {}", num);
        |                                         ^^^ `num` used here but it is possibly-uninitialized
     

Genom att lägga till en `else`-sats kan vi säkerställa att `num` alltid har ett värde. Koden kommer då att kompilera utan problem, eftersom kompilatorn kan verifiera detta vid kompileringstid.

    fn main() {
            let num:i32;
            if true{
                num = 100;
            }
            else{
                num = 50;
            }
            println!("The value of num is: {}", num);
    }
    

Och utdata blir:

        The value of num is: 100
    

Variablers oföränderlighet

Variabler i Rust är oföränderliga som standard, vilket skyddar mot att oavsiktligt ändra värden. Exempelvis:

    fn main() {
            let num1 = 10;
            num1 = 5;
            println!("The value of num1 is: {}", num1);
    }
    

Kompilatorn genererar ett fel när du försöker ändra en oföränderlig variabel. I detta fall ”kan inte tilldela två gånger till oföränderlig variabel `num1`”

         error[E0384]: cannot assign twice to immutable variable `num1`
        --> src/main.rs:3:5
         |
        2 |     let num1 = 10;
         |         ----
         |         |
         |         first assignment to `num1`
         |         help: consider making this binding mutable: `mut num1`
        3 |     num1 = 5;
         |     ^^^^^^^^ cannot assign twice to immutable variable
    

Ägande och lån

Ägandesystemet är kärnan i Rusts minnessäkerhet. Grundprinciperna är:

Varje datadel har en unik ägare. När ägaren lämnar sitt ”scope” så frigörs datan.

Tänk på detta enkla exempel. Här initieras strängen `str1` och dess värde flyttas till `str2`. Eftersom ett objekt endast kan ha en ägare, kan `str1` inte användas längre:

        fn main() {
            let str1 = String::from("Rust");
            let str2 = str1;
            println!("The value of str1 is: {}", str1);
        }
    

Detta resulterar i ett fel:

        error[E0382]: borrow of moved value: `str1`
         --> src/main.rs:4:42
          |
        2 |     let str1 = String::from("Rust");
          |         ---- move occurs because `str1` has type `String`, which does not implement the `Copy` trait
        3 |     let str2 = str1;
          |                ---- value moved here
        4 |     println!("The value of str1 is: {}", str1);
          |                                           ^^^^ value borrowed here after move
    

För att helt förstå ägandesystemet är det viktigt att lära sig om begreppen lån och referenser.

Snabb utveckling

Vi har diskuterat flera användbara funktioner i Rust. Sammanfattningsvis:

  • Rust är optimerad för hastighet och säkerhet.
  • Den har inbyggda pakethanteringsverktyg och ett byggsystem.
  • Den har också ett omfattande standardbibliotek.

Rust erbjuder en heltäckande utvecklingsmiljö, som möjliggör snabb applikationsutveckling med minimal felsökning och snabba byggprocesser.

Plattformsoberoende utveckling

Rust stödjer utveckling på Linux, MacOS och Windows. Applikationsutveckling underlättas eftersom Rust-källkod kan kompileras till en körbar fil utan att förlita sig på andra byggverktyg.

En engagerad gemenskap är viktig för en lyckad inlärningsresa. Rust har en stor och växande användarbas.

Rusts popularitet i StackOverflow-undersökningen visar att det finns en stor gemenskap av användare som gärna delar med sig av sin kunskap.

Förutom officiell dokumentation finns det också användargenererade dokumentationssidor och diskussionsforum. Rust subreddit och LinkedIn-grupper är också bra resurser.

Lärresurser för Rust

Följande är en lista över resurser som kan hjälpa dig att starta din resa med Rust.

#1. Rust By Example

Rust By Example lär dig grunderna och standardbiblioteket genom praktiska exempel som du kan köra i en online-redigerare.

Ämnen som tas upp inkluderar ”crates”, Cargo, generiska typer, ”traits”, felhantering med mera.

#2. Rustlings

Rustlings är ytterligare en officiell inlärningsresurs som liknar Rust By Example. Den kräver dock att du konfigurerar din lokala utvecklingsmiljö, klonar en exempelrepo och löser enkla problem.

#3. Exercism Rust Track

Rust Track on Exercism har över 100 övningar. Exercism är en gratis plattform där du kan få mentor av erfarna programmerare.

#4. Ultimate Rust Crash Course

Ultimate Rust Crash Course på Udemy, av Nathan Stocks, täcker:

  • Grunderna i Rust-programmering
  • Modulsystem
  • Datatyper och kontrollflöde
  • Referenser och lån
  • Strukturer, ”traits”, och samlingar

#5. Ultimate Rust 2: Intermediate Concepts

Ultimate Rust 2 är en uppföljningskurs till Ultimate Rust Crash Course och täcker:

  • Stängningar
  • Iteratorer
  • Felhantering
  • Enhets- och integrationstester
  • Loggning, multitrådning och kanaler

#6. Rust lang: The Complete Beginner’s Guide 2023

Denna Udemy-kurs av Catalin Stefan är en omfattande kurs i Rust-programmering, som berör:

  • Grundläggande Rust
  • Datatyper, kontrollstrukturer
  • Funktioner, ”traits”
  • Minneshantering
  • Samtidighet

#7. Programming Rust: Fast, Safe Systems Development

”Programming Rust” av O’Reilly är en populär Rust-programmeringsbok som lär ut:

  • Grundläggande datatyper
  • Ägande och lån
  • Asynkron programmering
  • Snabb flertrådning
  • Stängningar och iteratorer
  • Samlingar

#8. The Rust Programming Language, 2nd Edition

”The Rust Programming Language” är skriven av Rust-gemenskapen och är en bok som täcker allt du behöver veta om Rust, inklusive:

  • Ägande och lån
  • Generiska typer och ”traits”
  • Smarta pekare och multitrådning
  • Testning och felhantering

#9. The Complete Rust Programming Reference Guide

”The Complete Rust Programming Reference Guide” från Packt tar upp:

  • Implementering av datastrukturer i Rust
  • Skriva återanvändbara och testbara komponenter
  • Design av flertrådade applikationer
  • Rust inom WebAssembly, nätverk och kommandoradsapplikationer

#10. Creative Projects for Rust Programmers

”Creative Projects for Rust Programmers” från Packt riktar sig till mer erfarna utvecklare och lär ut Rust genom projekt som:

  • Bygga REST-webbtjänster
  • 2D-spel
  • Webbutveckling med WebAssembly
  • Maskinspråksemulatorer
  • och mer!

Slutsats

Den här artikeln gav en introduktion till Rust och dess unika fördelar. Vi lyfte fram funktioner som minnessäkerhet, förbättrad pakethantering och mer. Dessutom gav vi en lista på inlärningsresurser för dig som vill lära dig Rust.

Nästa steg är att utforska de rekommenderade inlärningsresurserna för att lära dig Rusts grunder. Lycka till med din Rust-programmering!

Du kan även utforska några av de bästa leverantörerna av Rust-serverhosting.