mirror of
https://github.com/alrayyes/wiki.git
synced 2024-11-29 14:36:22 +00:00
151 lines
3.2 KiB
Markdown
151 lines
3.2 KiB
Markdown
---
|
||
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);
|
||
}
|
||
```
|