Skip to content

Basics

Initializing varaibles

Variables are initialized with let keyword. Variables can optionally have a type declared

rust

let a = 3;
let b: i32 = 3;

Variables initialised by let keyword are not mutatble. We have to use mut keyword to make the variables mutable.

rust
let mut a = 3;
a = 4;

Rust also provides const keyword to initialize global variables that cannot be mutated, the convention is to use capital letters for them. static keyword is used to initialize variables that have fixed memory location for the entire life-cycle of the program const and static need to explicitly state the type

rust
const COUNTER: u32 = 0;
static GLOBAL_COUNTER: u32 = 0;

References

References allow you to access a value indirectly.

rust

let x = 5;
let r = &x;

Types

Rust provides the following types for numbers: u8 to u128 for unsigned integers, i8 to i128 for signed integers. isize and usize have arch dependent sized. Rust has str and String type for string. This handles utf-8 by default.

Stack vs Heap

The stack stores local values with known size at compile time. The heap stores dynamically allocated data whose size or lifetime is managed at runtime.

Collections

Arrays: These are lists of fixed size that contain items of same type

Tuples: These are lists of fixed size that can hold values of different types

Vectors: These are list which can be extended in size and modified for every item on every index

rust
let arr = [1, 2, 3, 4, 5];
let tup = (1, 2, 3, 4, 5);
let vector = vec![1, 2, 3, 4, 5];

Generics

T and E are generic type parameters. Rust will substitute concrete types when the code is compiled.

rust
Vec<T>
Option<T>
Result<T, E>

Functions

Function are declared with fn keyword and input and output types need to be specified for every function

rust

fn write_something (mut s: String) -> String {
  s.push_str("What ?");
  s
}

Closures

Closures are unnamed anonymous function

rust
|x| {
  2*x
}

Compound Types

Enums and Structs are compount types which help us represent complex data types or gather similar data together

rust

struct Cat {
  name: String,
  weight: u32,
  breed: String
}

enum Breeds {
   MaineCoon,
    Siamese,
    Bengal,
    Sphynx,
}

Implementation

We can add methods to our enums or structs, giving us a sort of class

rust
impl Cat {
  pub fn new(name: &str, breed: &str, weight: u32) -> Cat {
    Cat {
      name: name.to_string(),
      weight,
      breed: breed.to_string()
    }
  }

  fn is_fat(&self) -> bool {
     self.weight > 6 
  } 
}

pub keyword is added to make the function/struct/enum public, by defauolt its private

Traits

Traits are methods that define a common funciton that various types can use

rust

trait GetName {
  
 fn get_name(&self) -> String;

}

impl GetName for Cat {
  fn get_name(&self) -> String {
    self.name.clone()
  }
}

Attributes

Attributes are compiler directives and metadata attached to Rust items.

rust
#[derive(Debug)]
#[test]
#[allow(dead_code)]
#[cfg(target_os = "linux")]

These are some examples, Debug: This allows us to print custom types for debugging PartialEq: This allows us to check equality with custom types allow(dead_code): Prevents warning for unused code

Pattern matching

Like a switch but for Rust. This forces you to check all possible patterns

rust
match value {
    1 => println!("one"),
    _ => println!("other"),
}

_ is used for the case when nothing else matched, the default check.

Option and Result

These are special enums are comonly used to handle ambigous outputs

Option<T> can have Some(T) or None for a response Result<T, E> can have Ok(T) or Err(error) for a response

Error handling

  1. Matching
rust
// For option
match value {
    Some(v) => v,
    None => return,
}

// For resut
match value {
    Ok(v) => v,
    Err(err) => {
        println!("Error: {}", err);
        return;
    }
}
  1. ?
rust
let result = function()?;

This will not panic if there is error but return the error instead to the parent function

Modules

importing module, crates

rust
  use::utils::helper::validator

Macros

Macros generate Rust code during compilation.

rust
println!("Write something to console");
vec![1, 2, 3];
panic!("Crash the program at this point");

Loops

  1. loop
rust

let mut i = 0;
loop {
  if i == 5 {
    break;
  }
  i += 1;
}
  1. while
rust

let mut i = 0;
while i <= 5 {
  i += 1;
}

3. `for`

```rust
for i in 0..5 {
  println!("{}", i);
}

4. Iteratoring over collections

```rust

let list = vec![0, 1, 2, 3];

for item in list {
  println!("{}", item);
}

Convention

ItemConventionExample
Variablessnake_caseuser_name
Functionssnake_caseread_file
Methodssnake_caseget_name
Modulessnake_casefile_utils
Cratessnake_caseserde_json
TraitsUpperCamelCaseDisplay
StructsUpperCamelCaseUserAccount
EnumsUpperCamelCaseConnectionState
Enum VariantsUpperCamelCaseConnected
Type AliasesUpperCamelCaseUserId
ConstantsSCREAMING_SNAKE_CASEMAX_RETRIES
StaticsSCREAMING_SNAKE_CASEGLOBAL_COUNTER
Generic TypesSingle uppercase letterT, E, K, V