wiki/content/20200827171554-variables_in_rust.md

153 lines
3.2 KiB
Markdown
Raw Normal View History

2024-05-06 20:40:05 +00:00
---
2024-10-30 17:34:11 +00:00
date: 2020-08-27
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 well 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 were
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 arrays 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);
}
```