--- title: Rust date: 2022-01-01 11:51:44 background: bg-black tags: categories: - Programming intro: | The Rust quick reference cheat sheet that aims at providing help on writing basic syntax and methods. plugins: - copyCode --- ## Getting Started ### Hello_World.rs ```rust fn main() { println!("Hello, World!"); } ``` #### Compiling and Running ```shell $ rustc Hello_World.rs $ ./Hello_World Hello, World! ``` ### Primitive types | | | | ------------------------- | :------------------------------ | | `bool` | Boolean (`true` _/_ `false`) | | `char` | character | | `f32`, `f64` | 32-bits, 64-bits floats | | `i64`, `i32`, `i16`, `i8` | signed 16- ... integers | | `u64`, `u32`, `u16`, `u8` | unsigned 16-bits, ... integers | | `isize` | pointer-sized signed integers | | `usize` | pointer-sized unsigned integers | See: [Rust Types](#rust-types) ### Formatting {.row-span-2} ```rust {.wrap} // Single Placeholder println!("{}", 1); // Multiple Placeholder println!("{} {}", 1, 3); // Positional Arguments println!( "{0} is a {1} {2}, also {0} is a {3} programming language", "Rust", "cool", "language", "safe" ); // Named Arguments println!( "{country} is a diverse nation with unity.", country = "India" ); // Placeholder traits :b for binary, :0x is for hex and :o is octal println!("Let us print 76 is binary which is {:b} , and hex equivalent is {:0x} and octal equivalent is {:o}", 76, 76, 76); // Debug Trait println!( "Print whatever we want to here using debug trait {:?}", (76, 'A', 90) ); // New Format Strings in 1.58 let x = "world"; println!("Hello {x}!"); ``` ### Printing Styles ```rust // Prints the output print!("Hello World\n"); // Appends a new line after printing println!("Appending a new line"); // Prints as an error eprint!("This is an error\n"); // Prints as an error with new line eprintln!("This is an error with new line"); ``` ### Variables ```rust // Initializing and declaring a variable let some_variable = "This_is_a_variable"; // Making a variable mutable let mut mutable_variable = "Mutable"; // Assigning multiple variables let (name, age) = ("ElementalX", 20); // (Global) constant const SCREAMING_SNAKE_CASE: i64 = 9; ``` ### Comments ```rust // Line Comments /*.............Block Comments */ /// Outer doc comments //! Inner doc comments ``` See: [Comment](https://doc.rust-lang.org/reference/comments.html) ### Functions ```rust fn test() { println!("This is a function!"); } fn main() { test(); } ``` See: [Functions](#rust-functions) ## Rust Types ### Integer ```rust let mut a: u32 = 8; let b: u64 = 877; let c: i64 = 8999; let d = -90; ``` ### Floating-Point ```rust let mut sixty_bit_float: f64 = 89.90; let thirty_two_bit_float: f32 = 7.90; let just_a_float = 69.69; ``` ### Boolean ```rust {.wrap} let true_val: bool = true; let false_val: bool = false; let just_a_bool = true; let is_true = 8 < 5; // => false ``` ### Character ```rust let first_letter_of_alphabet = 'a'; let explicit_char: char = 'F'; let implicit_char = '8'; let emoji = "\u{1f600}"; // => 😀 ``` ### String Literal ```rust {.wrap} let community_name = "AXIAL"; let no_of_members: &str = "ten"; println!("The name of the community is {community_name} and it has {no_of_members} members"); ``` See: [Strings](#rust-strings) ### Arrays ```rust ┌─────┬─────┬─────┬─────┬─────┬─────┐ | 92 | 97 | 98 | 99 | 98 | 94 | └─────┴─────┴─────┴─────┴─────┴─────┘ 0 1 2 3 4 5 ``` --- ```rust let array: [i64; 6] = [92, 97, 98, 99, 98, 94]; ``` ### Multi-Dimensional Array {.row-span-2} ```rust j0 j1 j2 j3 j4 j5 ┌────┬────┬────┬────┬────┬────┐ i0 | 1 | 2 | 3 | 4 | 5 | 6 | ├────┼────┼────┼────┼────┼────┤ i1 | 6 | 5 | 4 | 3 | 2 | 1 | └────┴────┴────┴────┴────┴────┘ ``` --- ```rust let array: [[i64; 6]; 2] = [ [1, 2, 3, 4, 5, 6], [6, 5, 4, 3, 2, 1] ]; ``` ### Mutable Array ```rust let mut array: [i32; 3] = [2, 6, 10]; array[1] = 4; array[2] = 6; ``` Use the `mut` keyword to make it mutable. ### Slices ```rust let mut array: [i64; 4] = [1, 2, 3, 4]; let mut slices: &[i64] = &array[0..3]; // Lower range is inclusive and upper range is exclusive println!("The elements of the slices are : {slices:?}"); ``` ### Vectors ```rust let some_vector = vec![1, 2, 3, 4, 5]; ``` A vector is declared using the `vec!` macro. ### Tuples ```rust let tuple = (1, 'A', "Cool", 78, true); ``` ## Rust Strings ### String Literal ```rust let cs: &str = "cheat sheet"; // => Share cheat sheet for developers println!("Share {cs} for developers"); ``` ### String Object ```rust // Creating an empty string object let my_string = String::new(); // Converting to a string object let S_string = a_string.to_string(); // Creating an initialized string object let lang = String::from("Rust"); println!("First language is {lang}"); ``` ### .capacity() ```rust let rand = String::from("Random String"); rand.capacity() // => 13 ``` Calculates the capacity of the string in bytes. ### .contains() ```rust let name = String::from("ElementalX"); name.contains("Element") // => true ``` Checks if the substring is contained inside the original string or not. ### Pushing a single character ```rust let mut half_text = String::from("Hal"); half_text.push('f'); // => Half ``` ### Pushing an entire String ```rust let mut hi = String::from("Hey there..."); hi.push_str("How are you doing??"); // => Hey there...How are you doing?? println!("{hi}"); ``` ## Rust Operators ### Comparison Operators | | | | -------- | :------------------------------- | | `e == f` | `e` is equal to `f` | | `e != f` | `e` is NOT equal to `f` | | `e < f` | `e` is less than `f` | | `e > f` | `e` is greater than `f` | | `e <= f` | `e` is less than or equal to `f` | | `e >= f` | `e` is greater or equal to `f` | --- ```rust let (e, f) = (1, 100); let greater = f > e; // => true let less = f < e; // => false let greater_equal = f >= e; // => true let less_equal = e <= f; // => true let equal_to = e == f; // => false let not_equal_to = e != f; // => true ``` ### Arithmetic Operators | | | | -------- | :----------------------------------------- | | `a + b` | `a` is added to `b` | | `a - b` | `b` is subtracted from `a` | | `a / b` | `a` is divided by `b` | | `a % b` | Gets remainder of `a` by dividing with `b` | | `a * b` | `a` is multiplied with `b` | --- ```rust {.wrap} let (a, b) = (4, 5); let sum: i32 = a + b; // => 9 let subtractions: i32 = a - b; // => -1 let multiplication: i32 = a * b; // => 20 let division: i32 = a / b; // => 0 let modulus: i32 = a % b; // => 4 ``` ### Bitwise Operators | Operator | Description | | ------------------- | ----------------------- | | `g & h` | Binary AND | | g \| h | Binary OR | | `g ^ h` | Binary XOR | | `!g` | Binary one's complement | | `g << h` | Binary shift left | | `g >> h` | Binary shift right | --- ```rust {.wrap} let (g, h) = (0x1, 0x2); let bitwise_and = g & h; // => 0 let bitwise_or = g | h; // => 3 let bitwise_xor = g ^ h; // => 3 let right_shift = g >> 2; // => 0 let left_shift = h << 4; // => 32 ``` ### Logical Operators | Example | Meaning | | --------------------- | --------------------- | | `c && d` | Both are true _(AND)_ | | c \|\| d | Either is true _(OR)_ | | `!c` | `c` is false _(NOT)_ | --- ```rust let (c, d) = (true, false); let and = c && d; // => false let or = c || d; // => true let not = !c; // => false ``` ### Compound Assignment Operator ```rust let mut k = 9; let mut l = k; ``` --- | Operator | Description | | -------------------- | --------------------------------------- | | `k += l` | Add a value and assign, then k=18 | | `k -= l` | Subtract a value and assign, then k=0 | | `k /= l` | Divide a value and assign, then k=1 | | `k *= l` | Multiply a value and assign, then k=81 | | k \|= l | Bitwise OR and assign, then k=89 | ## Rust Flow Control ### If Expression ```rust let case1: i32 = 81; let case2: i32 = 82; if case1 < case2 { println!("case1 is less than case2"); } ``` ### If...Else Expression ```rust let case3 = 8; let case4 = 9; if case3 >= case4 { println!("case3 is better than case4"); } else { println!("case4 is greater than case3"); } ``` ### If...Else...if...Else Expression ```rust let foo = 12; let bar = 13; if foo == bar { println!("foo is equal to bar"); } else if foo < bar { println!("foo less than bar"); } else if foo != bar { println!("foo is not equal to bar"); } else { println!("Nothing"); } ``` ### If...Let Expression {.row-span-3} ```rust let mut arr1: [i64; 3] = [1, 2, 3]; if let [1, 2, _] = arr1 { println!("Works with array"); } let mut arr2: [&str; 2] = ["one", "two"]; if let ["Apple", _] = arr2 { println!("Works with str array too"); } ``` --- ```rust let tuple_1 = ("India", 7, 90, 90.432); if let (_, 7, 9, 78.99) = tuple_1 { println!("Works with tuples too"); } let tuple_2 = (9, 7, 89, 12, "Okay"); if let (9, 7, 89, 12, blank) = tuple_2 { println!("Everything {blank} mate?"); } let tuple_3 = (89, 90, "Yes"); if let (9, 89, "Yes") = tuple_3 { println!("Pattern did match"); } else { println!("Pattern did not match"); } ``` ### Match Expression {.row-span-3} ```rust let day_of_week = 2; match day_of_week { 1 => { println!("Its Monday my dudes"); } 2 => { println!("It's Tuesday my dudes"); } 3 => { println!("It's Wednesday my dudes"); } 4 => { println!("It's Thursday my dudes"); } 5 => { println!("It's Friday my dudes"); } 6 => { println!("It's Saturday my dudes"); } 7 => { println!("It's Sunday my dudes"); } _ => { println!("Default!") } }; ``` ### Nested...If Expression ```rust let nested_conditions = 89; if nested_conditions == 89 { let just_a_value = 98; if just_a_value >= 97 { println!("Greater than 97"); } } ``` ### For Loop ```rust for mut i in 0..15 { i -= 1; println!("The value of i is : {i}"); } ``` ### While Loop ```rust let mut check = 0; while check < 11 { println!("Check is : {check}"); check += 1; println!("After incrementing: {check}"); if check == 10 { break; // stop while } } ``` ### Loop keyword ```rust loop { println!("hello world forever!"); } ``` The infinite loop indicated. ### Break Statement ```rust let mut i = 1; loop { println!("i is {i}"); if i > 100 { break; } i *= 2; } ``` ### Continue Statement ```rust for (v, c) in (0..10 + 1).enumerate() { println!("The {c} number loop"); if v == 9 { println!("Here we go continue?"); continue; } println!("The value of v is : {v}"); } ``` ## Rust Functions ### Basic function ```rust fn print_message() { println!("Hello, CheatSheets.zip!"); } fn main() { //Invoking a function in Rust. print_message(); } ``` ### Pass by Value ```rust fn main() { let x: u32 = 10; let y: u32 = 20; // => 200 println!("Calc: {}", cal_rect(x, y)); } fn cal_rect(x: u32, y: u32) -> u32 { x * y } ``` ### Pass by Reference ```rust fn main() { let mut by_ref = 3; // => 3 power_of_three(&mut by_ref); println!("{by_ref}"); // => 9 } fn power_of_three(by_ref: &mut i32) { // de-referencing is important *by_ref = *by_ref * *by_ref; println!("{by_ref}"); // => 9 } ``` ### Returns ```rust {.wrap} fn main() { let (mut radius, mut pi) = (3.0, 3.14); let (area, _perimeter) = calculate( &mut radius, &mut pi ); println!("The area and the perimeter of the circle are: {area} & {_perimeter}"); } fn calculate(radius: &mut f64, pi: &mut f64) -> (f64, f64) { let perimeter = 2.0 * *pi * *radius; let area = *pi * *radius * *radius; return (area, perimeter); } ``` ### Arrays as Arguments ```rust fn main() { let mut array: [i32; 5] = [1, 2, 3, 4, 6]; print_arrays(array); println!("The elements: {array:?}"); } fn print_arrays(mut array: [i32; 5]) { array[0] = 89; array[1] = 90; array[2] = 91; array[3] = 92; array[4] = 93; println!("The elements: {array:?}"); } ``` ### Returning Arrays ```rust fn main() { let mut arr: [i32; 5] = [2, 4, 6, 8, 10]; multiply(arr); println!("The array is : {:?}", multiply(arr)); } fn multiply(mut arr: [i32; 5]) -> [i32; 5] { arr[2] = 90; for mut i in 0..5 { arr[i] = arr[i] * arr[2]; } return arr; } ``` ## Misc ### Type Casting ```rust let a_int = 90; // int // int to float let mut type_cast = (a_int as f64); ``` --- ```rust let original: char = 'I'; // char to int => 73 let type_casted: i64 = original as i64; ``` To perform type-casting in Rust one must use the `as` keyword. ### Borrowing ```rust let mut foo = 4; let mut borrowed_foo = &foo; println!("{borrowed_foo}"); ``` --- ```rust let mut bar = 3; let mut mutable_borrowed_bar = &mut bar; println!("{mutable_borrowed_bar}"); ``` Here borrowed value borrows the value from value one using `&` operator. ### De-referencing ```rust let mut borrow = 10; let deref = &mut borrow; println!("{}", *deref); ``` De-referencing in rust can be done using the `*` operator ### Variable Scope ```rust { // The scope limited to this braces let a_number = 1; } println!("{a_number}"); ``` This will produce error as the scope of the variable `a_number` ends at the braces ## Also see - [The Rust Document](https://doc.rust-lang.org/book/ch00-00-introduction.html) _(doc.rust-lang.org)_ - [The Rust Reference](https://doc.rust-lang.org/reference/introduction.html) _(doc.rust-lang.org)_ - [Rust Cheatsheet](https://phaiax.github.io/rust-cheatsheet/) _(phaiax.github.io)_