Rust Basics
Main Function
In every Rust program, the main function executes first:
fn main() { // code here will run first }
Variables
In Rust, we use let bindings to introduce variables. Variables are immutable
or mutable.
Immutable Variables
By default, variables are immutable in Rust. This means that once a value is
bound to the variable, the binding cannot be changed. We use let bindings to
introduce immutable variables as follows:
fn main() { let x = 5; }
In this example, we introduce a variable x of type i32 (a 32-bit signed
integer type) and bind the value 5 to it.
You cannot assign to an immutable variable. So the following example causes a compiler error:
fn main() { let x = 5; x = 6; // ERROR: cannot assign twice to immutable variable x }
Mutable Variables
If you want to be able to assign to a variable, it must be marked as mutable
with let mut:
fn main() { let mut x = 5; x = 6; //OK }
Copies
For simple types like integers, binding and assignment creates a copy.
For example, we can bind the value 5 to x and then bind y with a copy of x:
fn main() { let x = 5; let y = x; }
Copying occurs only for simple types like i32 and other types that
have been marked as copyable (they implement the Copy trait -- we will not
discuss traits here).
We will discuss how more interesting data
structures that are not copyable behave differently in later sections
of the tutorial.
Functions
Besides main, we can define additional functions. In the following example, we
define a function called plus_one which takes an i32 as input and returns an
i32 value that is one more than the input:
fn main() { let six = plus_one(5); } fn plus_one(x: i32) -> i32 { x + 1 }
Notice how there is no explicit return. In Rust, if the last expression in the
function body does not end in a semicolon, it is the return value. (Rust also
has a return keyword, but we do not use it here.)
Printing to the Terminal
In Rust, we can print to the terminal using println!:
fn main() { println!("Hello, world!") }
This code prints Hello, world! to the terminal, followed by a newline
character.
We can also use curly brackets in the input string of println! as a
placeholder for subsequent arguments:
fn main() { let x = 1; let y = 2; println!("x = {} and y = {}", x, y); }
This prints x = 1 and y = 2.
Note that the ! at the end of println! indicates that it is a macro, not a
function. It behaves slightly differently from normal functions, but you do not
need to worry about the details here.