First quiz and its related modules
This commit is contained in:
parent
36e66b545e
commit
52ed5dbcf9
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
// This exercise uses some concepts that we won't get to until later in the course, like `Box` and the
|
// This exercise uses some concepts that we won't get to until later in the course, like `Box` and the
|
||||||
// `From` trait. It's not important to understand them in detail right now, but you can read ahead if you like.
|
// `From` trait. It's not important to understand them in detail right now, but you can read ahead if you like.
|
||||||
// For now, think of the `Box<dyn ???>` type as an "I want anything that does ???" type, which, given
|
// For now, think of the `Box<dyn ...>` type as an "I want anything that does ???" type, which, given
|
||||||
// Rust's usual standards for runtime safety, should strike you as somewhat lenient!
|
// Rust's usual standards for runtime safety, should strike you as somewhat lenient!
|
||||||
|
|
||||||
// In short, this particular use case for boxes is for when you want to own a value and you care only that it is a
|
// In short, this particular use case for boxes is for when you want to own a value and you care only that it is a
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
// functions1.rs
|
// functions1.rs
|
||||||
// Execute `rustlings hint functions1` or use the `hint` watch subcommand for a hint.
|
// Execute `rustlings hint functions1` or use the `hint` watch subcommand for a hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
call_me();
|
call_me();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn call_me() {
|
||||||
|
println!("I'm Nidhal Messaoudi, a software developer going Rusty!!!");
|
||||||
|
}
|
||||||
|
|
|
@ -1,13 +1,11 @@
|
||||||
// functions2.rs
|
// functions2.rs
|
||||||
// Execute `rustlings hint functions2` or use the `hint` watch subcommand for a hint.
|
// Execute `rustlings hint functions2` or use the `hint` watch subcommand for a hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
call_me(3);
|
call_me(3);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn call_me(num:) {
|
fn call_me(num: i32) {
|
||||||
for i in 0..num {
|
for i in 0..num {
|
||||||
println!("Ring! Call number {}", i + 1);
|
println!("Ring! Call number {}", i + 1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,8 @@
|
||||||
// functions3.rs
|
// functions3.rs
|
||||||
// Execute `rustlings hint functions3` or use the `hint` watch subcommand for a hint.
|
// Execute `rustlings hint functions3` or use the `hint` watch subcommand for a hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
call_me();
|
call_me(12);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn call_me(num: u32) {
|
fn call_me(num: u32) {
|
||||||
|
|
|
@ -7,14 +7,12 @@
|
||||||
// in the signatures for now. If anything, this is a good way to peek ahead
|
// in the signatures for now. If anything, this is a good way to peek ahead
|
||||||
// to future exercises!)
|
// to future exercises!)
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let original_price = 51;
|
let original_price = 51;
|
||||||
println!("Your sale price is {}", sale_price(original_price));
|
println!("Your sale price is {}", sale_price(original_price));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn sale_price(price: i32) -> {
|
fn sale_price(price: i32) -> i32 {
|
||||||
if is_even(price) {
|
if is_even(price) {
|
||||||
price - 10
|
price - 10
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -1,13 +1,11 @@
|
||||||
// functions5.rs
|
// functions5.rs
|
||||||
// Execute `rustlings hint functions5` or use the `hint` watch subcommand for a hint.
|
// Execute `rustlings hint functions5` or use the `hint` watch subcommand for a hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let answer = square(3);
|
let answer = square(3);
|
||||||
println!("The square of 3 is {}", answer);
|
println!("The square of 3 is {}", answer);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn square(num: i32) -> i32 {
|
fn square(num: i32) -> i32 {
|
||||||
num * num;
|
return num * num;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,16 @@
|
||||||
// if1.rs
|
// if1.rs
|
||||||
// Execute `rustlings hint if1` or use the `hint` watch subcommand for a hint.
|
// Execute `rustlings hint if1` or use the `hint` watch subcommand for a hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
pub fn bigger(a: i32, b: i32) -> i32 {
|
pub fn bigger(a: i32, b: i32) -> i32 {
|
||||||
// Complete this function to return the bigger number!
|
// Complete this function to return the bigger number!
|
||||||
// Do not use:
|
// Do not use:
|
||||||
// - another function call
|
// - another function call
|
||||||
// - additional variables
|
// - additional variables
|
||||||
|
if a > b {
|
||||||
|
a
|
||||||
|
} else {
|
||||||
|
b
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't mind this for now :)
|
// Don't mind this for now :)
|
||||||
|
|
|
@ -4,13 +4,13 @@
|
||||||
// Step 2: Get the bar_for_fuzz and default_to_baz tests passing!
|
// Step 2: Get the bar_for_fuzz and default_to_baz tests passing!
|
||||||
// Execute `rustlings hint if2` or use the `hint` watch subcommand for a hint.
|
// Execute `rustlings hint if2` or use the `hint` watch subcommand for a hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
pub fn foo_if_fizz(fizzish: &str) -> &str {
|
pub fn foo_if_fizz(fizzish: &str) -> &str {
|
||||||
if fizzish == "fizz" {
|
if fizzish == "fuzz" {
|
||||||
|
"bar"
|
||||||
|
} else if fizzish == "fizz" {
|
||||||
"foo"
|
"foo"
|
||||||
} else {
|
} else {
|
||||||
1
|
"baz"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,8 +9,6 @@
|
||||||
// when you change one of the lines below! Try adding a `println!` line, or try changing
|
// when you change one of the lines below! Try adding a `println!` line, or try changing
|
||||||
// what it outputs in your terminal. Try removing a semicolon and see what happens!
|
// what it outputs in your terminal. Try removing a semicolon and see what happens!
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
println!("Hello and");
|
println!("Hello and");
|
||||||
println!(r#" welcome to... "#);
|
println!(r#" welcome to... "#);
|
||||||
|
|
|
@ -2,8 +2,6 @@
|
||||||
// Make the code print a greeting to the world.
|
// Make the code print a greeting to the world.
|
||||||
// Execute `rustlings hint intro2` or use the `hint` watch subcommand for a hint.
|
// Execute `rustlings hint intro2` or use the `hint` watch subcommand for a hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
println!("Hello {}!");
|
println!("Hello {}!", "World");
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
fn main() {
|
fn main () {
|
||||||
let my_fav_fruits = vec!["banana", "custard apple", "avocado", "peach", "raspberry"];
|
let my_fav_fruits = vec!["banana", "custard apple", "avocado", "peach", "raspberry"];
|
||||||
|
|
||||||
let mut my_iterable_fav_fruits = ???; // TODO: Step 1
|
let mut my_iterable_fav_fruits = ???; // TODO: Step 1
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
#[rustfmt::skip]
|
|
||||||
macro_rules! my_macro {
|
macro_rules! my_macro {
|
||||||
() => {
|
() => {
|
||||||
println!("Check out my macro!");
|
println!("Check out my macro!");
|
||||||
|
|
|
@ -10,10 +10,20 @@
|
||||||
// Write a function that calculates the price of an order of apples given
|
// Write a function that calculates the price of an order of apples given
|
||||||
// the quantity bought. No hints this time!
|
// the quantity bought. No hints this time!
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
// Put your function here!
|
// Put your function here!
|
||||||
// fn calculate_price_of_apples {
|
fn calculate_price_of_apples(quantity: i32) -> i32 {
|
||||||
|
let mut quantity= quantity;
|
||||||
|
if quantity <= 40 {
|
||||||
|
quantity = quantity * 2;
|
||||||
|
}
|
||||||
|
return quantity;
|
||||||
|
|
||||||
|
// if quantity > 40 {
|
||||||
|
// quantity
|
||||||
|
// } else {
|
||||||
|
// quantity * 2
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
// Don't modify this function!
|
// Don't modify this function!
|
||||||
#[test]
|
#[test]
|
||||||
|
|
|
@ -32,7 +32,7 @@ fn main() {
|
||||||
for offset in 0..8 {
|
for offset in 0..8 {
|
||||||
let child_numbers = // TODO
|
let child_numbers = // TODO
|
||||||
joinhandles.push(thread::spawn(move || {
|
joinhandles.push(thread::spawn(move || {
|
||||||
let sum: u32 = child_numbers.iter().filter(|&&n| n % 8 == offset).sum();
|
let sum: u32 = child_numbers.iter().filter(|n| *n % 8 == offset).sum();
|
||||||
println!("Sum of offset {} is {}", offset, sum);
|
println!("Sum of offset {} is {}", offset, sum);
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,9 +4,6 @@
|
||||||
// Cow is a clone-on-write smart pointer.
|
// Cow is a clone-on-write smart pointer.
|
||||||
// It can enclose and provide immutable access to borrowed data, and clone the data lazily when mutation or ownership is required.
|
// It can enclose and provide immutable access to borrowed data, and clone the data lazily when mutation or ownership is required.
|
||||||
// The type is designed to work with general borrowed data via the Borrow trait.
|
// The type is designed to work with general borrowed data via the Borrow trait.
|
||||||
//
|
|
||||||
// This exercise is meant to show you what to expect when passing data to Cow.
|
|
||||||
// Fix the unit tests by checking for Cow::Owned(_) and Cow::Borrowed(_) at the TODO markers.
|
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
@ -23,52 +20,29 @@ fn abs_all<'a, 'b>(input: &'a mut Cow<'b, [i32]>) -> &'a mut Cow<'b, [i32]> {
|
||||||
input
|
input
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
fn main() {
|
||||||
mod tests {
|
|
||||||
use super::*;
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn reference_mutation() -> Result<(), &'static str> {
|
|
||||||
// Clone occurs because `input` needs to be mutated.
|
|
||||||
let slice = [-1, 0, 1];
|
|
||||||
let mut input = Cow::from(&slice[..]);
|
|
||||||
match abs_all(&mut input) {
|
|
||||||
Cow::Owned(_) => Ok(()),
|
|
||||||
_ => Err("Expected owned value"),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn reference_no_mutation() -> Result<(), &'static str> {
|
|
||||||
// No clone occurs because `input` doesn't need to be mutated.
|
// No clone occurs because `input` doesn't need to be mutated.
|
||||||
let slice = [0, 1, 2];
|
let slice = [0, 1, 2];
|
||||||
let mut input = Cow::from(&slice[..]);
|
let mut input = Cow::from(&slice[..]);
|
||||||
match abs_all(&mut input) {
|
match abs_all(&mut input) {
|
||||||
// TODO
|
Cow::Borrowed(_) => println!("I borrowed the slice!"),
|
||||||
}
|
_ => panic!("expected borrowed value"),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
// Clone occurs because `input` needs to be mutated.
|
||||||
fn owned_no_mutation() -> Result<(), &'static str> {
|
let slice = [-1, 0, 1];
|
||||||
// We can also pass `slice` without `&` so Cow owns it directly.
|
let mut input = Cow::from(&slice[..]);
|
||||||
// In this case no mutation occurs and thus also no clone,
|
|
||||||
// but the result is still owned because it always was.
|
|
||||||
let slice = vec![0, 1, 2];
|
|
||||||
let mut input = Cow::from(slice);
|
|
||||||
match abs_all(&mut input) {
|
match abs_all(&mut input) {
|
||||||
// TODO
|
Cow::Owned(_) => println!("I modified the slice and now own it!"),
|
||||||
}
|
_ => panic!("expected owned value"),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
// No clone occurs because `input` is already owned.
|
||||||
fn owned_mutation() -> Result<(), &'static str> {
|
|
||||||
// Of course this is also the case if a mutation does occur.
|
|
||||||
// In this case the call to `to_mut()` returns a reference to
|
|
||||||
// the same data as before.
|
|
||||||
let slice = vec![-1, 0, 1];
|
let slice = vec![-1, 0, 1];
|
||||||
let mut input = Cow::from(slice);
|
let mut input = Cow::from(slice);
|
||||||
match abs_all(&mut input) {
|
match abs_all(&mut input) {
|
||||||
// TODO
|
// TODO
|
||||||
}
|
Cow::Borrowed(_) => println!("I own this slice!"),
|
||||||
|
_ => panic!("expected borrowed value"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,9 +2,7 @@
|
||||||
// Make me compile!
|
// Make me compile!
|
||||||
// Execute `rustlings hint variables1` or use the `hint` watch subcommand for a hint.
|
// Execute `rustlings hint variables1` or use the `hint` watch subcommand for a hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
x = 5;
|
let x = 5;
|
||||||
println!("x has the value {}", x);
|
println!("x has the value {}", x);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,8 @@
|
||||||
// variables2.rs
|
// variables2.rs
|
||||||
// Execute `rustlings hint variables2` or use the `hint` watch subcommand for a hint.
|
// Execute `rustlings hint variables2` or use the `hint` watch subcommand for a hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let x;
|
let x = 12;
|
||||||
if x == 10 {
|
if x == 10 {
|
||||||
println!("x is ten!");
|
println!("x is ten!");
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -1,9 +1,7 @@
|
||||||
// variables3.rs
|
// variables3.rs
|
||||||
// Execute `rustlings hint variables3` or use the `hint` watch subcommand for a hint.
|
// Execute `rustlings hint variables3` or use the `hint` watch subcommand for a hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let x: i32;
|
let x: i32 = 12;
|
||||||
println!("Number {}", x);
|
println!("Number {}", x);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,8 @@
|
||||||
// variables4.rs
|
// variables4.rs
|
||||||
// Execute `rustlings hint variables4` or use the `hint` watch subcommand for a hint.
|
// Execute `rustlings hint variables4` or use the `hint` watch subcommand for a hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let x = 3;
|
let mut x = 3;
|
||||||
println!("Number {}", x);
|
println!("Number {}", x);
|
||||||
x = 5; // don't change this line
|
x = 5; // don't change this line
|
||||||
println!("Number {}", x);
|
println!("Number {}", x);
|
||||||
|
|
|
@ -1,11 +1,9 @@
|
||||||
// variables5.rs
|
// variables5.rs
|
||||||
// Execute `rustlings hint variables5` or use the `hint` watch subcommand for a hint.
|
// Execute `rustlings hint variables5` or use the `hint` watch subcommand for a hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let number = "T-H-R-E-E"; // don't change this line
|
let number = "T-H-R-E-E"; // don't change this line
|
||||||
println!("Spell a Number : {}", number);
|
println!("Spell a Number : {}", number);
|
||||||
number = 3; // don't rename this variable
|
let number = 3; // don't rename this variable
|
||||||
println!("Number plus two is : {}", number + 2);
|
println!("Number plus two is : {}", number + 2);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,7 @@
|
||||||
// variables6.rs
|
// variables6.rs
|
||||||
// Execute `rustlings hint variables6` or use the `hint` watch subcommand for a hint.
|
// Execute `rustlings hint variables6` or use the `hint` watch subcommand for a hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
const NUMBER: i32 = 3;
|
||||||
|
|
||||||
const NUMBER = 3;
|
|
||||||
fn main() {
|
fn main() {
|
||||||
println!("Number {}", NUMBER);
|
println!("Number {}", NUMBER);
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,5 +13,3 @@ the other useful data structure, hash maps, later.
|
||||||
## Further information
|
## Further information
|
||||||
|
|
||||||
- [Storing Lists of Values with Vectors](https://doc.rust-lang.org/stable/book/ch08-01-vectors.html)
|
- [Storing Lists of Values with Vectors](https://doc.rust-lang.org/stable/book/ch08-01-vectors.html)
|
||||||
- [`iter_mut`](https://doc.rust-lang.org/std/primitive.slice.html#method.iter_mut)
|
|
||||||
- [`map`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.map)
|
|
||||||
|
|
Loading…
Reference in New Issue