Rápida Introdução ao Rust

Me

História

  • Criada em 2006 por Graydon Hoare.
  • Patrocinada pela Mozilla em 2009.
  • Versão 1.0 em 2015.
  • Versão atual: 1.35
  • Objetivo: Criar uma linguagem rápida mas com seguraça de memória.

História

Basic (com números e estruturado) , dBase III Plus , Clipper , Pascal , Cobol , Delphi (ObjectPascal) , C , C++ , ActionScript (Flash) , PHP , JavaScript , Python , Objective-C , Clojure , Java , Scala , Rust.

A language that doesn't affect the way you think about programming, is not worth knowing.
-- Alan Perlis, "ALGOL"

Meu Primeiro Rust


fn main() {
    println!("Hello, world!");
}
                        

Meu Primeiro Rust

Tempo para gerar esse código:

0 segundos

Meu Primeiro Rust

cargo init

Cargo

"Cargo is the Rust package manager"

"Cargo downloads your Rust package’s dependencies, compiles your packages, makes distributable packages, and uploads them to crates.io, the Rust community’s package registry."

Mas De Volta Ao Rust


fn main() {
    let a:u8 = 2;
    println!("{}", a);
}
                        

Mas De Volta Ao Rust


fn main() {
    let a = 2u8;
    println!("{}", a);
}
                        

Mas De Volta Ao Rust


fn main() {
    let a = 2;
    println!("{}", a);
}
                        

Mas De Volta ao Rust


fn factorial(i: u64) -> u64 {
    match i {
        0 => 1,
        n => n * factorial(n-1)
    }
}
                        

Mas De Volta ao Rust


fn is_pred(i: u64) -> Bool {
    if i % 2 == 0 {
       True
    } else {
       False
    }
}
                        

Mas De Volta ao Rust


fn is_pred(i: u64) -> Bool {
    i % 2 == 0
}
                        

Mas De Volta ao Rust


enum IPAddr {
    IPV4,
    IPV6
}
                        

Mas De Volta ao Rust


enum IPAddr {
    IPV4(String),
    IPV6(String)
}
                        

Mas De Volta ao Rust


let home = IpAddr::V4(String::from("127.0.0.1");

match home {
    V4(ipv4_address) => println!("IPv4 addr: {}", ipv4_address),
    V6(ipv6_address) => println!("Ipv6 addr: {}", ipv6_address),
}
                        

E Aquela "Segurança de Memória"?

1. No Null Pointers


match may_not_exist(value: Option<String>) {
    match value {
        Some(the_string) => println!("I got a string! {}", the_string),
        None => println!("I got nothing")
    }
}
                        

2. No Shared Memory


fn main() {
   let a = String::from("A reference to a string in the code section copied to the stack");
   let b = a;
   println!("The string is: {}", a);
}
                        

2. No Shared Memory


fn main() {
   let a = String::from("A reference to a string in the code section copied to the stack");
   let b = &a;
   println!("The string is: {}", a);
}
                        
presente := Presente { ... }
canal <- presente
 
presente := Presente { ... }
canal <- presente
presente.abrir()

3. Immutable variables by default


fn main() {
    let a = 3;
    a = 5;
}
                        

Error Control


enum Result<T, E> {
    Ok(T),
    Err(E),
}
                        

match File::create("something.txt") {
    Ok(fp) => fp.write_all(b"Hello world"),
    Err(err) => println!("Failure! {}", err),
}
                        

Compilador Chato mas Amigável


fn main() {
    let a = 2;
    a = 3;
    println!("{}", a);
}
                        

3 |     let a = 2;
  |         -
  |         |
  |         first assignment to `a`
  |         help: make this binding mutable: `mut a`
4 |     a = 3;
  |     ^^^^^ cannot assign twice to immutable variable
                        

3 |     let a = 2;
  |         -
  |         |
  |         first assignment to `a`
  |         help: make this binding mutable: `mut a`
4 |     a = 3;
  |     ^^^^^ cannot assign twice to immutable variable
                        

3 |     let a = 2;
  |         -
  |         |
  |         first assignment to `a`
  |         help: make this binding mutable: `mut a`
4 |     a = 3;
  |     ^^^^^ cannot assign twice to immutable variable
                        

A linguagem mais amada segundo o StackOverflow Survey 2019

... pelo 4⁰ ano seguido.

E agora?