Skip to main content

Rust

Getting Started

# Install rustup
curl --proto '=https' --tlsv1.3 https://sh.rustup.rs -sSf | sh

rustc --version

rustup update

rustup self uninstall

rustup doc

main.rs

fn main() {
println!("Hello, world!"); // 4 tabs
}
rustc main.rs
./main.rs
cargo --version

# Source code at `src`
cargo new hello_cargo
cd hello_cargo

cargo new --help

Cargo.toml

[package]
name = "hello_cargo"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
# Default debug build
cargo build

./target/debug/hello_cargo

cargo run

cargo check

cargo build --release

cargo doc --open

Common Programming Concepts

// Can not change type
let mut x = 1; mut // Mutable
x = 2;

// Constants
// `const` can not allow `mut`
// Must declare data type
const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;

// Shadowing
fn main() {
let x = 5; // 5
let x = x + 1; // 6
{
let x = x * 2; // 12
}
// 6
}

let guess: u32 = "42".parse().expect("Not a number !");

// literals
let x = 87u8; // unsigned 8 bits
let x = 1_000; // 1000
let x = 0o77; // 8 bits
let x = 0xff; // 16 bits
let x = 0b1111_0000; // 2 bits
let x = b'A'; // unsigned 8 bits

// Default f64, IEEE-754
fn main() {
let x = 2.0; // f64

let y: f32 = 3.0; // f32
}

fn main() {
let sum = 5 + 10;

let difference = 95.5 - 4.3;

let product = 4 * 30;

let quotient = 56.7 / 32.2;
let truncated = -5 / 3; // -1

let remainder = 43 % 5;
}

fn main() {
let t = true; // 1 bit

let f: bool = false;
}

fn main() {
let c = 'z'; // 4 bytes Unicode
let z: char = 'ℤ';
let heart_eyed_cat = '😻';
}

// Truple
fn main() {
let tup: (i32, f64, u8) = (500, 6.4, 1);

// Pattern matching, destructuring
let (x, y, z) = tup;

let five_hundred = tup.0;

let six_point_four = tup.1;

let one = tup.2;
}

fn main() {
let a = [1, 2, 3, 4, 5];

let a: [i32; 5] = [1, 2, 3, 4, 5];

let a = [3; 5]; // 3, 3, 3, 3, 3

let first = a[0];
let second = a[1];
}

fn main() {
another_function();
}

fn another_function() {
println!("Another function.");
}

fn main() {
another_function(5);
another_function2(1, 'a');
}

fn another_function(x: i32) {
println!("{x}"); // 5
}

fn another_function2(x: i32, y: char) {
println!("x = {x}, y = {y}"); // x= 1, y = a
}

fn main() { // Statements
let y = 6; // Statements
}

fn main() {
let x = (let y = 6); // error: expected expression
let x = y = 6; // error
}

fn main() {
let x = 5;

let y = {
let x = 3;
x + 1 // Expressions, `;` will not return value
}; // y = 4

println!("y = {y}");
}
fn five() -> i32 { // return value and type
5
}

fn main() {
let x = five();

println!("{x}"); // 5
}
fn main() {
let x = plus_one(5);

println!("x = {x}"); // x = 6
}

fn plus_one(x: i32) -> i32 {
x + 1
}
fn main() {
let number = 6;

if number % 4 == 0 { // `if` is Expressions
println!("1");
} else if number % 3 == 0 {
println!("2");
} else if number % 2 == 0 {
println!("3");
} else {
println!("4");
}
}
fn main() {
let condition = true;
let number = if condition { 5 } else { 6 };

println!("{number}"); // 5
}
fn main() {
loop {
println!("Again.");
}
}
fn main() {
let mut counter = 0;

let result = loop {
counter += 1;

if counter == 10 {
break counter * 2; // Must have `;`
}
};

println!("{result}");
}
fn main() {
let mut count = 0;
'counting_up: loop { // loop label
println!("count = {count}");
let mut remaining = 10;

loop {
println!("remaining = {remaining}");
if remaining == 9 {
break;
}
if count == 2 {
break 'counting_up;
}
remaining -= 1;
}

count += 1;
}
println!("End count = {count}");
}
// count = 0
// remaining = 10
// remaining = 9
// count = 1
// remaining = 10
// remaining = 9
// count = 2
// remaining = 10
// End count = 2
fn main() {
let mut number = 3;

while number != 0 {
println!("{number}!");

number -= 1;
}

println!("end");
}
fn main() {
let a = [10, 20, 30, 40, 50];

for element in a {
println!("{element}");
}
}
fn main() {
for number in (1..4).rev() { // 4, 3, 2, 1
println!("{number}!");
}
println!("end");
}

Ownership

Avoid garbage collector.