2024-05-06 20:40:05 +00:00
|
|
|
|
---
|
2024-10-30 17:04:36 +00:00
|
|
|
|
date: 20200827
|
2024-05-06 20:40:05 +00:00
|
|
|
|
id: 9a604084-80a1-4868-be7b-950e7f43b65d
|
|
|
|
|
title: Rust variables
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
# Mutability
|
|
|
|
|
|
|
|
|
|
By default variables in Rust are immutable. To make a variable mutable
|
|
|
|
|
one must explicity add \`mut\` in front of it
|
|
|
|
|
|
|
|
|
|
``` rust
|
|
|
|
|
fn main() {
|
|
|
|
|
let mut x = 5;
|
|
|
|
|
println!("The value of x is: {}", x);
|
|
|
|
|
x = 6;
|
|
|
|
|
println!("The value of x is: {}", x);
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
# Constants
|
|
|
|
|
|
|
|
|
|
Constatns are values that are bound to a name and are not allowed to
|
|
|
|
|
change. Some differences with variables:
|
|
|
|
|
|
|
|
|
|
- You can't use \`mut\` with constants
|
|
|
|
|
- Constants are delared with \`const\` keyword instead of \`let\`
|
|
|
|
|
- Type value must be annotated
|
|
|
|
|
- Constants can be declared in any scope
|
|
|
|
|
- Constants may only be set to a constant expression, not the result
|
|
|
|
|
of a function call of any other value that could only be computed at
|
|
|
|
|
runtime
|
|
|
|
|
|
|
|
|
|
``` rust
|
|
|
|
|
#![allow(unused_variables)]
|
|
|
|
|
fn main() {
|
|
|
|
|
const MAX_POINTS: u32 = 100_000;
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
# Shadowing
|
|
|
|
|
|
|
|
|
|
You can declare a new variable with the same value as a previous
|
|
|
|
|
variable. The new variable "shadows" the previous variable
|
|
|
|
|
|
|
|
|
|
``` rust
|
|
|
|
|
fn main() {
|
|
|
|
|
let x = 5;
|
|
|
|
|
|
|
|
|
|
let x = x + 1;
|
|
|
|
|
|
|
|
|
|
let x = x * 2;
|
|
|
|
|
|
|
|
|
|
println!("The value of x is: {}", x);
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Shadowing is different from marking a variable as mut, because we’ll get
|
|
|
|
|
a compile-time error if we accidentally try to reassign to this variable
|
|
|
|
|
without using the let keyword. By using let, we can perform a few
|
|
|
|
|
transformations on a value but have the variable be immutable after
|
|
|
|
|
those transformations have been completed.
|
|
|
|
|
|
|
|
|
|
The other difference between mut and shadowing is that because we’re
|
|
|
|
|
effectively creating a new variable when we use the let keyword again,
|
|
|
|
|
we can change the type of the value but reuse the same name. For
|
|
|
|
|
example, say our program asks a user to show how many spaces they want
|
|
|
|
|
between some text by inputting space characters, but we really want to
|
|
|
|
|
store that input as a number:
|
|
|
|
|
|
|
|
|
|
``` rust
|
|
|
|
|
fn main() {
|
|
|
|
|
let spaces = " ";
|
|
|
|
|
let spaces = spaces.len();
|
|
|
|
|
|
|
|
|
|
println!("There are {} spaces in the string", spaces)
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
# Data types
|
|
|
|
|
|
|
|
|
|
## Tuple
|
|
|
|
|
|
|
|
|
|
Tuple elements can be accessed directly by using a period.
|
|
|
|
|
|
|
|
|
|
``` rust
|
|
|
|
|
fn main() {
|
|
|
|
|
let tup: (i32, f64, u8) = (500, 6.4, 1);
|
|
|
|
|
|
|
|
|
|
println!("These are the tuple values {} {} {}", tup.0, tup.1, tup.2)
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Array
|
|
|
|
|
|
|
|
|
|
In Rust every element of an array must have the same type. They also
|
|
|
|
|
have a fixed length, like tuples.
|
|
|
|
|
|
|
|
|
|
``` rust
|
|
|
|
|
fn main() {
|
|
|
|
|
let _a = [1, 2, 3, 4, 5];
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
You would write an array’s type by using square brackets, and within the
|
|
|
|
|
brackets include the type of each element, a semicolon, and then the
|
|
|
|
|
number of elements in the array, like so:
|
|
|
|
|
|
|
|
|
|
``` rust
|
|
|
|
|
#![allow(unused_variables)]
|
|
|
|
|
fn main() {
|
|
|
|
|
let a: [i32; 5] = [1, 2, 3, 4, 5];
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
You can also easily initialize an array that contains the same value for
|
|
|
|
|
each element:
|
|
|
|
|
|
|
|
|
|
``` rust
|
|
|
|
|
#![allow(unused_variables)]
|
|
|
|
|
fn main() {
|
|
|
|
|
let a = [3; 5];
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Accessing array elements is also straightforward:
|
|
|
|
|
|
|
|
|
|
``` rust
|
|
|
|
|
#![allow(unused_variables)]
|
|
|
|
|
fn main() {
|
|
|
|
|
let a = [1, 2, 3, 4, 5];
|
|
|
|
|
|
|
|
|
|
let first = a[0];
|
|
|
|
|
let second = a[1];
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Destructuring
|
|
|
|
|
|
|
|
|
|
Rust also supports destructuring
|
|
|
|
|
|
|
|
|
|
``` rust
|
|
|
|
|
fn main() {
|
|
|
|
|
let tup = (500, 6.4, 1);
|
|
|
|
|
|
|
|
|
|
let (x, y, z) = tup;
|
|
|
|
|
|
|
|
|
|
println!("The value of x is: {}", x);
|
|
|
|
|
println!("The value of y is: {}", y);
|
|
|
|
|
println!("The value of z is: {}", z);
|
|
|
|
|
}
|
|
|
|
|
```
|