Install Rust
curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
Hello World Example
vi main.rs
fn main() { println!("Hello, world!"); }
Compile
rustc ./main.rs
Run
./main
Hello, world!
Using the Package Manager
Create a project using Cargo
cargo new hello_cargo
Creating binary (application) `hello_cargo` package note: see more `Cargo.toml` keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
This command creates a folder with the name of the new project containing a src directory and the dependency file called Cargo.toml.
hello_cargo ├── .git │ ├── HEAD │ ├── config │ ├── description │ ├── hooks │ │ └── README.sample │ ├── info │ │ └── exclude │ ├── objects │ │ ├── info │ │ └── pack │ └── refs │ ├── heads │ └── tags ├── .gitignore ├── Cargo.toml └── src └── main.rs
It has also initialized a new Git repository along with a .gitignore file. Git files won’t be generated if you run cargo new
within an existing Git repository; you can override this behavior by using cargo new --vcs=git
.
Cargo.toml
[package] name = "hello_cargo" version = "0.1.0" edition = "2021" [dependencies]
Building
cargo build
Build and Run
cargo run
Build for Release
cargo build --release
This command will create an executable in target/release instead of target/debug. The optimizations make your Rust code run faster, but turning them on lengthens the time it takes for your program to compile. This is why there are two different profiles: one for development, when you want to rebuild quickly and often, and another for building the final program you’ll give to a user that won’t be rebuilt repeatedly and that will run as fast as possible. If you’re benchmarking your code’s running time, be sure to run
cargo build --release
and benchmark with the executable in target/release.
Variables
Immutable/Mutable
Variables by default are immutable, meaning they can't be changed once set.
fn main() { let x = 5; println!("The value of x is: {x}"); x = 6; println!("The value of x is: {x}"); }
The above code would generate an error since we are trying to overwrite the value of x.
We can make the variable mutable by adding mut the initial assignment:
fn main() { let mut x = 5; println!("The value of x is: {x}"); x = 6; println!("The value of x is: {x}"); }
The above code compiles.
Constants
You declare constants using the const
keyword instead of the let
keyword, and the type of the value must be annotated.
Constants can be declared in any scope, including the global scope, which makes them useful for values that many parts of code need to know about.
const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3; const PI: f32 = 3.14;
Rust’s naming convention for constants is to use all uppercase with underscores between words.
Shadowing
You can declare a new variable with the same name as a previous variable. Rustaceans say that the first variable is shadowed by the second, which means that the second variable is what the compiler will see when you use the name of the variable.
fn main() { let x = 5; let x = x + 1; { let x = x * 2; println!("The value of x in the inner scope is: {x}"); } println!("The value of x is: {x}"); }
$ cargo run Compiling variables v0.1.0 (file:///projects/variables) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.31s Running `target/debug/variables` The value of x in the inner scope is: 12 The value of x is: 6
Data Types
Integer Types
Length | Signed | Unsigned |
---|---|---|
8-bit | i8 | u8 |
16-bit | i16 | u16 |
32-bit | i32 | u32 |
64-bit | i64 | u64 |
128-bit | i128 | u128 |
arch | isize | usize |
Number Literals
Number literals can also use _
as a visual separator to make the number easier to read, such as 1_000
, which will have the same value as if you had specified 1000
.
Number literals | Example |
---|---|
Decimal | 98_222 |
Hex | 0xff |
Octal | 0o77 |
Binary | 0b1111_0000 |
Byte (u8 only) | b'A' |
Floating-Point Types
Rust’s floating-point types are f32 and f64, which are 32 bits and 64 bits in size, respectively. The default type is f64 because on modern CPUs, it’s roughly the same speed as f32 but is capable of more precision. All floating-point types are signed.
fn main() { let x = 2.0; // f64 let y: f32 = 3.0; // f32 }
Boolean Type
Booleans are one byte in size. The Boolean type in Rust is specified using bool.
fn main() { let t = true; let f: bool = false; // with explicit type annotation }
Character Type
Rust’s char type is the language’s most primitive alphabetic type.
Note that we specify char literals with single quotes, as opposed to string literals, which use double quotes.
fn main() { let c = 'z'; let z: char = 'ℤ'; // with explicit type annotation let heart_eyed_cat = '😻'; }
Compound Types
Compound types can group multiple values into one type. Rust has two primitive compound types: tuples and arrays.
Tuple Type
A tuple is a general way of grouping together a number of values with a variety of types into one compound type. Tuples have a fixed length: once declared, they cannot grow or shrink in size.
fn main() { let tup = (500, 6.4, 1); let (x, y, z) = tup; println!("The value of y is: {y}"); }
This program first creates a tuple and binds it to the variable tup. It then uses a pattern with let to take tup and turn it into three separate variables, x, y, and z. This is called destructuring because it breaks the single tuple into three parts. Finally, the program prints the value of y, which is 6.4.
We can also access a tuple element directly by using a period (.) followed by the index of the value we want to access. For example:
fn main() { let x: (i32, f64, u8) = (500, 6.4, 1); let five_hundred = x.0; let six_point_four = x.1; let one = x.2; }
Array Type
Unlike a tuple, every element of an array must have the same type. Unlike arrays in some other languages, arrays in Rust have a fixed length.
fn main() { let months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; let a: [i32; 5] = [1, 2, 3, 4, 5]; //access values let first = a[0]; let second = a[1]; }
IntelliJ IDE
To use Rust in IntelliJ install the following plugins:
- Rust
- Native Debugging Support
References
Reference | URL |
---|---|
The Rust Programming Language | https://doc.rust-lang.org/book/title-page.html |
Rust by Example | https://doc.rust-lang.org/rust-by-example/index.html |