Day 1: Morning#
1. What is Rust#
Rust is a statically compiled language with similar functionality to cpp.
- rustc uses LLVM as its backend.
- Rust and cpp are suitable for similar scenarios.
- Extremely high flexibility.
- High level of control.
- Can be scaled down to very constrained devices such as microcontrollers.
- No runtime and garbage collection.
- Focuses on program reliability and safety without sacrificing any performance.
2. Why choose Rust#
Some unique features of Rust:
- Compiler memory safety.
- No runtime undefined behavior.
- Modern programming language features.
2.1 Compile-time guarantees#
Compile-time static memory management:
- No uninitialized variables.
- No memory leaks.
- No "double free".
- No "use after free".
- No NULL pointers.
- No forgotten mutexes.
- No data races between threads.
- No iterator invalidation.
2.2 Runtime guarantees#
Rust has no runtime undefined behavior:
- Array access has boundary checks.
- Integer overflow is defined (panic or wrap-around).
2.3 Modern features#
Language features:
- Enums and pattern matching.
- Generics.
- Zero-cost abstractions for FFI.
- Zero-cost abstractions.
Tools:
- Powerful compiler error messages.
- Built-in dependency manager.
- Built-in support for unit tests.
- Excellent implementation of the Language Server Protocol.
3. Basic syntax#
3.1 Scalar types#
Type | Literals | |
---|---|---|
Signed integers | i8 , i16 , i32 , i64 , i128 , isize | -10 , 0 , 1_000 , 123_i64 |
Unsigned integers | u8 , u16 , u32 , u64 , u128 , usize | 0 , 123 , 10_u16 |
Floating-point numbers | f32 , f64 | 3.14 , -10.0e20 , 2_f32 |
Strings | &str | "foo" , "two\nlines" |
Unicode scalar types | char | 'a' , 'α' , '∞' |
Boolean values | bool | true , false |
The space occupied by each type is: |
iN
,uN
, andfN
occupy N bits,isize
andusize
occupy space equal to the size of a pointer,char
is 32 bits wide,bool
is 8 bits wide.
3.2 Compound types#
Type | Literals | |
---|---|---|
Arrays | [T; N] | [20, 30, 40] , [0; 3] |
Tuples | () , (T,) , (T1, T2) , … | () , ('x',) , ('x', 1.2) , … |
Assignment and access of arrays: |
fn main() {
let mut a: [i8; 10] = [42; 10];
a[5] = 0;
println!("a: {:?}", a);
}
Assignment and access of tuples:
fn main() {
let t: (i8, bool) = (7, true);
println!("t.0: {:?}", t.0);
println!("t.1: {:?}", t.1);
}
3.3 References#
Rust also provides reference types.
fn main() {
let mut x: i32 = 10;
let ref_x: &mut i32 = &mut x;
*ref_x = 20;
println!("x: {x}");
}
Note the difference between let mut ref_x: &i32
and let ref_x: &mut i32
. The former declares a mutable reference, allowing us to modify the value bound to this reference; the latter declares a reference to a mutable variable.