Initial commit
This commit is contained in:
commit
7feaccd899
120 changed files with 8079 additions and 0 deletions
8
exercises/00_intro/README.md
Normal file
8
exercises/00_intro/README.md
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
# Intro
|
||||
|
||||
Rust uses the `print!` and `println!` macros to print text to the console.
|
||||
|
||||
## Further information
|
||||
|
||||
- [Hello World](https://doc.rust-lang.org/rust-by-example/hello.html)
|
||||
- [Formatted print](https://doc.rust-lang.org/rust-by-example/hello/print.html)
|
||||
24
exercises/00_intro/intro1.rs
Normal file
24
exercises/00_intro/intro1.rs
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
// TODO: We sometimes encourage you to keep trying things on a given exercise
|
||||
// even after you already figured it out. If you got everything working and feel
|
||||
// ready for the next exercise, enter `n` in the terminal.
|
||||
//
|
||||
// The exercise file will be reloaded when you change one of the lines below!
|
||||
// Try adding a new `println!` and check the updated output in the terminal.
|
||||
|
||||
fn main() {
|
||||
println!(r#" Welcome to... "#);
|
||||
println!(r#" _ _ _ "#);
|
||||
println!(r#" _ __ _ _ ___| |_| (_)_ __ __ _ ___ "#);
|
||||
println!(r#" | '__| | | / __| __| | | '_ \ / _` / __| "#);
|
||||
println!(r#" | | | |_| \__ \ |_| | | | | | (_| \__ \ "#);
|
||||
println!(r#" |_| \__,_|___/\__|_|_|_| |_|\__, |___/ "#);
|
||||
println!(r#" |___/ "#);
|
||||
println!();
|
||||
println!("This exercise compiles successfully. The remaining exercises contain a compiler");
|
||||
println!("or logic error. The central concept behind Rustlings is to fix these errors and");
|
||||
println!("solve the exercises. Good luck!");
|
||||
println!();
|
||||
println!("The file of this exercise is `exercises/00_intro/intro1.rs`. Have a look!");
|
||||
println!("The current exercise path will be always shown under the progress bar.");
|
||||
println!("You can click on the path to open the exercise file in your editor.");
|
||||
}
|
||||
4
exercises/00_intro/intro2.rs
Normal file
4
exercises/00_intro/intro2.rs
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
fn main() {
|
||||
// TODO: Fix the code to print "Hello world!".
|
||||
println!("Hello world!");
|
||||
}
|
||||
9
exercises/01_variables/README.md
Normal file
9
exercises/01_variables/README.md
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
# Variables
|
||||
|
||||
In Rust, variables are immutable by default.
|
||||
When a variable is immutable, once a value is bound to a name, you can’t change that value.
|
||||
You can make them mutable by adding `mut` in front of the variable name.
|
||||
|
||||
## Further information
|
||||
|
||||
- [Variables and Mutability](https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html)
|
||||
6
exercises/01_variables/variables1.rs
Normal file
6
exercises/01_variables/variables1.rs
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
fn main() {
|
||||
// TODO: Add the missing keyword.
|
||||
let x = 5;
|
||||
|
||||
println!("x has the value {x}");
|
||||
}
|
||||
10
exercises/01_variables/variables2.rs
Normal file
10
exercises/01_variables/variables2.rs
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
fn main() {
|
||||
// TODO: Change the line below to fix the compiler error.
|
||||
let x = 0;
|
||||
|
||||
if x == 10 {
|
||||
println!("x is ten!");
|
||||
} else {
|
||||
println!("x is not ten!");
|
||||
}
|
||||
}
|
||||
6
exercises/01_variables/variables3.rs
Normal file
6
exercises/01_variables/variables3.rs
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
fn main() {
|
||||
// TODO: Change the line below to fix the compiler error.
|
||||
let x: i32 = 0;
|
||||
|
||||
println!("Number {x}");
|
||||
}
|
||||
8
exercises/01_variables/variables4.rs
Normal file
8
exercises/01_variables/variables4.rs
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
// TODO: Fix the compiler error.
|
||||
fn main() {
|
||||
let mut x = 3;
|
||||
println!("Number {x}");
|
||||
|
||||
x = 5; // Don't change this line
|
||||
println!("Number {x}");
|
||||
}
|
||||
8
exercises/01_variables/variables5.rs
Normal file
8
exercises/01_variables/variables5.rs
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
fn main() {
|
||||
let number = "T-H-R-E-E"; // Don't change this line
|
||||
println!("Spell a number: {}", number);
|
||||
|
||||
// TODO: Fix the compiler error by changing the line below without renaming the variable.
|
||||
let number = 3;
|
||||
println!("Number plus two is: {}", number + 2);
|
||||
}
|
||||
6
exercises/01_variables/variables6.rs
Normal file
6
exercises/01_variables/variables6.rs
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
// TODO: Change the line below to fix the compiler error.
|
||||
const NUMBER: i32 = 3;
|
||||
|
||||
fn main() {
|
||||
println!("Number: {NUMBER}");
|
||||
}
|
||||
8
exercises/02_functions/README.md
Normal file
8
exercises/02_functions/README.md
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
# Functions
|
||||
|
||||
Here, you'll learn how to write functions and how the Rust compiler can help you debug errors even
|
||||
in more complex code.
|
||||
|
||||
## Further information
|
||||
|
||||
- [How Functions Work](https://doc.rust-lang.org/book/ch03-03-how-functions-work.html)
|
||||
7
exercises/02_functions/functions1.rs
Normal file
7
exercises/02_functions/functions1.rs
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
// TODO: Add some function with the name `call_me` without arguments or a return value.
|
||||
|
||||
fn call_me() {}
|
||||
|
||||
fn main() {
|
||||
call_me(); // Don't change this line
|
||||
}
|
||||
10
exercises/02_functions/functions2.rs
Normal file
10
exercises/02_functions/functions2.rs
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
// TODO: Add the missing type of the argument `num` after the colon `:`.
|
||||
fn call_me(num: i32) {
|
||||
for i in 0..num {
|
||||
println!("Ring! Call number {}", i + 1);
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
call_me(3);
|
||||
}
|
||||
10
exercises/02_functions/functions3.rs
Normal file
10
exercises/02_functions/functions3.rs
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
fn call_me(num: u8) {
|
||||
for i in 0..num {
|
||||
println!("Ring! Call number {}", i + 1);
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// TODO: Fix the function call.
|
||||
call_me(3);
|
||||
}
|
||||
22
exercises/02_functions/functions4.rs
Normal file
22
exercises/02_functions/functions4.rs
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
// This store is having a sale where if the price is an even number, you get 10
|
||||
// Rustbucks off, but if it's an odd number, it's 3 Rustbucks off.
|
||||
// Don't worry about the function bodies themselves, we are only interested in
|
||||
// the signatures for now.
|
||||
|
||||
fn is_even(num: i64) -> bool {
|
||||
num % 2 == 0
|
||||
}
|
||||
|
||||
// TODO: Fix the function signature.
|
||||
fn sale_price(price: i64) -> i64 {
|
||||
if is_even(price) {
|
||||
price - 10
|
||||
} else {
|
||||
price - 3
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let original_price = 51;
|
||||
println!("Your sale price is {}", sale_price(original_price));
|
||||
}
|
||||
9
exercises/02_functions/functions5.rs
Normal file
9
exercises/02_functions/functions5.rs
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
// TODO: Fix the function body without changing the signature.
|
||||
fn square(num: i32) -> i32 {
|
||||
num * num
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let answer = square(3);
|
||||
println!("The square of 3 is {answer}");
|
||||
}
|
||||
7
exercises/03_if/README.md
Normal file
7
exercises/03_if/README.md
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
# If
|
||||
|
||||
`if`, the most basic (but still surprisingly versatile!) type of control flow, is what you'll learn here.
|
||||
|
||||
## Further information
|
||||
|
||||
- [Control Flow - if expressions](https://doc.rust-lang.org/book/ch03-05-control-flow.html#if-expressions)
|
||||
37
exercises/03_if/if1.rs
Normal file
37
exercises/03_if/if1.rs
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
fn bigger(a: i32, b: i32) -> i32 {
|
||||
// TODO: Complete this function to return the bigger number!
|
||||
// If both numbers are equal, any of them can be returned.
|
||||
// Do not use:
|
||||
// - another function call
|
||||
// - additional variables
|
||||
if a > b {
|
||||
a
|
||||
} else {
|
||||
b
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
// Don't mind this for now :)
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn ten_is_bigger_than_eight() {
|
||||
assert_eq!(10, bigger(10, 8));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn fortytwo_is_bigger_than_thirtytwo() {
|
||||
assert_eq!(42, bigger(32, 42));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn equal_numbers() {
|
||||
assert_eq!(42, bigger(42, 42));
|
||||
}
|
||||
}
|
||||
39
exercises/03_if/if2.rs
Normal file
39
exercises/03_if/if2.rs
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
// TODO: Fix the compiler error on this function.
|
||||
fn picky_eater(food: &str) -> &str {
|
||||
if food == "strawberry" {
|
||||
"Yummy!"
|
||||
} else if food == "potato" {
|
||||
"I guess I can eat that."
|
||||
} else {
|
||||
"No thanks!"
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
// TODO: Read the tests to understand the desired behavior.
|
||||
// Make all tests pass without changing them.
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn yummy_food() {
|
||||
// This means that calling `picky_eater` with the argument "food" should return "Yummy!".
|
||||
assert_eq!(picky_eater("strawberry"), "Yummy!");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn neutral_food() {
|
||||
assert_eq!(picky_eater("potato"), "I guess I can eat that.");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn default_disliked_food() {
|
||||
assert_eq!(picky_eater("broccoli"), "No thanks!");
|
||||
assert_eq!(picky_eater("gummy bears"), "No thanks!");
|
||||
assert_eq!(picky_eater("literally anything"), "No thanks!");
|
||||
}
|
||||
}
|
||||
53
exercises/03_if/if3.rs
Normal file
53
exercises/03_if/if3.rs
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
fn animal_habitat(animal: &str) -> &str {
|
||||
// TODO: Fix the compiler error in the statement below.
|
||||
let identifier = if animal == "crab" {
|
||||
1
|
||||
} else if animal == "gopher" {
|
||||
2
|
||||
} else if animal == "snake" {
|
||||
3
|
||||
} else {
|
||||
4
|
||||
};
|
||||
|
||||
// Don't change the expression below!
|
||||
if identifier == 1 {
|
||||
"Beach"
|
||||
} else if identifier == 2 {
|
||||
"Burrow"
|
||||
} else if identifier == 3 {
|
||||
"Desert"
|
||||
} else {
|
||||
"Unknown"
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
// Don't change the tests!
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn gopher_lives_in_burrow() {
|
||||
assert_eq!(animal_habitat("gopher"), "Burrow")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn snake_lives_in_desert() {
|
||||
assert_eq!(animal_habitat("snake"), "Desert")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn crab_lives_on_beach() {
|
||||
assert_eq!(animal_habitat("crab"), "Beach")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn unknown_animal() {
|
||||
assert_eq!(animal_habitat("dinosaur"), "Unknown")
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue