Types

Scalar types integer, float, bool, char

Compound types tuple and array.

Tuple

#![allow(unused)] fn main() { let tup: (i32, f64, u8) = (500, 6.4, 1); let five_hundred = x.0; }

Values accessed by zero based indexing.

Array

#![allow(unused)] fn main() { let a: [i32; 5] = [1,2,3,4,5]; let a: [i32; 5] = [0; 5]; let last = a[4]; }

Fixed size. Stack allocated. Zero based indexing without the ..

Can be mutated.

#![allow(unused)] fn main() { let mut a = [1,2,3,4,5]; a[4] = 0; }

Can be sliced (range end is exclusive or inclusive (=i)).

#![allow(unused)] fn main() { let mut a = [1,2,3,4,5]; let b = &a[0..=4]; //whole array }

Vector

Resizable generic collection.

#![allow(unused)] fn main() { let mut my_vec: Vec<String> = Vec::new(); my_vec.push(name1); my_vec.push(name2); }

Can also declare with a macro:

#![allow(unused)] fn main() { let mut some_numbers = vec![4,5,6]; }

Can slice:

#![allow(unused)] fn main() { &some_numbers[0..] }

Or declare with a size:

#![allow(unused)] fn main() { let mut letters: Vec<char> = Vec::with_capacity(8); println!("{}", letters.capacity()); }

Enumerations

#![allow(unused)] fn main() { enum ThingsInTheSky { Sun, Stars, } ThingsInTheSky::Sun }

Values can have values, thus they are discriminated unions.

#![allow(unused)] fn main() { enum Feature { Note(u8), Rest(duration: u8), } let sound = Feature::Note(7); let no_sound = Feature::Rest(250); }

and they can have static functions and methods:

#![allow(unused)] fn main() { impl Feature { fun play(&self) {} fun new_rest(duration: u8) -> Self { Feature::Rest { duration } } } }