Variables
Binding and mutability
- 🌟 A variable can be used only if it has been initialized.
// Fix the error below with least amount of modification to the code fn main() { let x: i32; // Uninitialized but used, ERROR ! let y: i32; // Uninitialized but also unused, only a Warning ! assert_eq!(x, 5); println!("Success!"); }
- 🌟 Use
mut
to mark a variable as mutable.
// Fill the blanks in the code to make it compile fn main() { let __ __ = 1; __ += 2; assert_eq!(x, 3); println!("Success!"); }
Scope
A scope is the range within the program for which the item is valid.
- 🌟
// Fix the error below with least amount of modification fn main() { let x: i32 = 10; { let y: i32 = 5; println!("The value of x is {} and value of y is {}", x, y); } println!("The value of x is {} and value of y is {}", x, y); }
- 🌟🌟
// Fix the error with the use of define_x fn main() { println!("{}, world", x); } fn define_x() { let x = "hello"; }
Shadowing
You can declare a new variable with the same name as a previous variable, here we can say the first one is shadowed by the second one.
- 🌟🌟
// Only modify `assert_eq!` to make the `println!` work(print `42` in terminal) fn main() { let x: i32 = 5; { let x = 12; assert_eq!(x, 5); } assert_eq!(x, 12); let x = 42; println!("{}", x); // Prints "42". }
- 🌟🌟
// Remove a line in the code to make it compile fn main() { let mut x: i32 = 1; x = 7; // Shadowing and re-binding let x = x; x += 3; let y = 4; // Shadowing let y = "I can also be bound to text!"; println!("Success!"); }
Unused variables
- Fix the warning below with :
- 🌟 Only one solution
- 🌟🌟 Two distinct solutions
Note: none of the solutions is to remove the line
let x = 1
fn main() { let x = 1; } // Warning: unused variable: `x`
Destructuring
- 🌟🌟 We can use a pattern with
let
to destructure a tuple to separate variables.
Tips: you can use Shadowing or Mutability
// Fix the error below with least amount of modification fn main() { let (x, y) = (1, 2); x += 2; assert_eq!(x, 3); assert_eq!(y, 2); println!("Success!"); }
Destructuring assignments
Introduced in Rust 1.59: You can now use tuple, slice, and struct patterns as the left-hand side of an assignment.
- 🌟🌟
Note: the feature
Destructuring assignments
need 1.59 or higher Rust version
fn main() { let (x, y); (x,..) = (3, 4); [.., y] = [1, 2]; // Fill the blank to make the code work assert_eq!([x,y], __); println!("Success!"); }
You can find the solutions here(under the solutions path), but only use it when you need it