progress 82 percent

Change-Id: I5ec2fda8ecab66c8ee6fcf42ea32b4ffd915ea98
This commit is contained in:
murasame 2023-05-25 14:59:03 +08:00
parent 031a15a317
commit e64cd1f82e
30 changed files with 122 additions and 137 deletions

View File

@ -5,14 +5,12 @@
// construct to `Option` that can be used to express error conditions. Let's use it! // construct to `Option` that can be used to express error conditions. Let's use it!
// Execute `rustlings hint errors1` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint errors1` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE pub fn generate_nametag_text(name: String) -> Result<String, String> {
pub fn generate_nametag_text(name: String) -> Option<String> {
if name.is_empty() { if name.is_empty() {
// Empty names aren't allowed. // Empty names aren't allowed.
None Err("`name` was empty; it must be nonempty.".into())
} else { } else {
Some(format!("Hi! My name is {}", name)) Ok(format!("Hi! My name is {}", name))
} }
} }

View File

@ -17,16 +17,19 @@
// one is a lot shorter! // one is a lot shorter!
// Execute `rustlings hint errors2` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint errors2` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
use std::num::ParseIntError; use std::num::ParseIntError;
pub fn total_cost(item_quantity: &str) -> Result<i32, ParseIntError> { pub fn total_cost(item_quantity: &str) -> Result<i32, ParseIntError> {
let processing_fee = 1; let processing_fee = 1;
let cost_per_item = 5; let cost_per_item = 5;
let qty = item_quantity.parse::<i32>(); return match item_quantity.parse::<i32>() {
Ok(qty) => {
Ok(qty * cost_per_item + processing_fee) Ok(qty * cost_per_item + processing_fee)
}
Err(err) => {
Err(err)
}
};
} }
#[cfg(test)] #[cfg(test)]

View File

@ -4,15 +4,13 @@
// Why not? What should we do to fix it? // Why not? What should we do to fix it?
// Execute `rustlings hint errors3` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint errors3` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
use std::num::ParseIntError; use std::num::ParseIntError;
fn main() { fn main() {
let mut tokens = 100; let mut tokens = 100;
let pretend_user_input = "8"; let pretend_user_input = "8";
let cost = total_cost(pretend_user_input)?; let cost = total_cost(pretend_user_input).unwrap();
if cost > tokens { if cost > tokens {
println!("You can't afford that many!"); println!("You can't afford that many!");

View File

@ -1,8 +1,6 @@
// errors4.rs // errors4.rs
// Execute `rustlings hint errors4` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint errors4` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
#[derive(PartialEq, Debug)] #[derive(PartialEq, Debug)]
struct PositiveNonzeroInteger(u64); struct PositiveNonzeroInteger(u64);
@ -15,7 +13,13 @@ enum CreationError {
impl PositiveNonzeroInteger { impl PositiveNonzeroInteger {
fn new(value: i64) -> Result<PositiveNonzeroInteger, CreationError> { fn new(value: i64) -> Result<PositiveNonzeroInteger, CreationError> {
// Hmm...? Why is this only returning an Ok value? // Hmm...? Why is this only returning an Ok value?
Ok(PositiveNonzeroInteger(value as u64)) return if value < 0 {
Err(CreationError::Negative)
} else if value == 0 {
Err(CreationError::Zero)
} else {
Ok(PositiveNonzeroInteger(value as u64))
};
} }
} }

View File

@ -16,14 +16,12 @@
// Execute `rustlings hint errors5` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint errors5` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
use std::error; use std::error;
use std::error::Error;
use std::fmt; use std::fmt;
use std::num::ParseIntError; use std::num::ParseIntError;
// TODO: update the return type of `main()` to make this compile. fn main() -> Result<(), Box<dyn Error>> {
fn main() -> Result<(), Box<dyn ???>> {
let pretend_user_input = "42"; let pretend_user_input = "42";
let x: i64 = pretend_user_input.parse()?; let x: i64 = pretend_user_input.parse()?;
println!("output={:?}", PositiveNonzeroInteger::new(x)?); println!("output={:?}", PositiveNonzeroInteger::new(x)?);

View File

@ -8,8 +8,6 @@
// Execute `rustlings hint errors6` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint errors6` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
use std::num::ParseIntError; use std::num::ParseIntError;
// This is a custom error type that we will be using in `parse_pos_nonzero()`. // This is a custom error type that we will be using in `parse_pos_nonzero()`.
@ -23,14 +21,13 @@ impl ParsePosNonzeroError {
fn from_creation(err: CreationError) -> ParsePosNonzeroError { fn from_creation(err: CreationError) -> ParsePosNonzeroError {
ParsePosNonzeroError::Creation(err) ParsePosNonzeroError::Creation(err)
} }
// TODO: add another error conversion function here. fn from_parse_int(err: ParseIntError) -> ParsePosNonzeroError {
// fn from_parseint... ParsePosNonzeroError::ParseInt(err)
}
} }
fn parse_pos_nonzero(s: &str) -> Result<PositiveNonzeroInteger, ParsePosNonzeroError> { fn parse_pos_nonzero(s: &str) -> Result<PositiveNonzeroInteger, ParsePosNonzeroError> {
// TODO: change this to return an appropriate error instead of panicking let x: i64 = s.parse().map_err(ParsePosNonzeroError::from_parse_int)?;
// when `parse()` returns an error.
let x: i64 = s.parse().unwrap();
PositiveNonzeroInteger::new(x).map_err(ParsePosNonzeroError::from_creation) PositiveNonzeroInteger::new(x).map_err(ParsePosNonzeroError::from_creation)
} }

View File

@ -3,9 +3,7 @@
// Execute `rustlings hint generics1` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint generics1` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
fn main() { fn main() {
let mut shopping_list: Vec<?> = Vec::new(); let mut shopping_list: Vec<&str> = Vec::new();
shopping_list.push("milk"); shopping_list.push("milk");
} }

View File

@ -3,14 +3,12 @@
// Execute `rustlings hint generics2` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint generics2` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE struct Wrapper<T> {
value: T,
struct Wrapper {
value: u32,
} }
impl Wrapper { impl<T> Wrapper<T> {
pub fn new(value: u32) -> Self { pub fn new(value: T) -> Self {
Wrapper { value } Wrapper { value }
} }
} }

View File

@ -8,17 +8,15 @@
// //
// Execute `rustlings hint iterators1` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint iterators1` or use the `hint` watch subcommand for a hint.
// 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 = my_fav_fruits.iter();
assert_eq!(my_iterable_fav_fruits.next(), Some(&"banana")); assert_eq!(my_iterable_fav_fruits.next(), Some(&"banana"));
assert_eq!(my_iterable_fav_fruits.next(), ???); // TODO: Step 2 assert_eq!(my_iterable_fav_fruits.next(), Some(&"custard apple"));
assert_eq!(my_iterable_fav_fruits.next(), Some(&"avocado")); assert_eq!(my_iterable_fav_fruits.next(), Some(&"avocado"));
assert_eq!(my_iterable_fav_fruits.next(), ???); // TODO: Step 3 assert_eq!(my_iterable_fav_fruits.next(), Some(&"peach"));
assert_eq!(my_iterable_fav_fruits.next(), Some(&"raspberry")); assert_eq!(my_iterable_fav_fruits.next(), Some(&"raspberry"));
assert_eq!(my_iterable_fav_fruits.next(), ???); // TODO: Step 4 assert_eq!(my_iterable_fav_fruits.next(), None);
} }

View File

@ -3,7 +3,7 @@
// can offer. Follow the steps to complete the exercise. // can offer. Follow the steps to complete the exercise.
// Execute `rustlings hint iterators2` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint iterators2` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE use std::ops::Add;
// Step 1. // Step 1.
// Complete the `capitalize_first` function. // Complete the `capitalize_first` function.
@ -12,7 +12,9 @@ pub fn capitalize_first(input: &str) -> String {
let mut c = input.chars(); let mut c = input.chars();
match c.next() { match c.next() {
None => String::new(), None => String::new(),
Some(first) => ???, Some(first) => {
first.to_uppercase().to_string().add(&input[1..input.len()])
}
} }
} }
@ -21,7 +23,11 @@ pub fn capitalize_first(input: &str) -> String {
// Return a vector of strings. // Return a vector of strings.
// ["hello", "world"] -> ["Hello", "World"] // ["hello", "world"] -> ["Hello", "World"]
pub fn capitalize_words_vector(words: &[&str]) -> Vec<String> { pub fn capitalize_words_vector(words: &[&str]) -> Vec<String> {
vec![] let mut uppercase = vec![];
for x in words {
uppercase.push(capitalize_first(*x));
}
uppercase
} }
// Step 3. // Step 3.
@ -29,7 +35,11 @@ pub fn capitalize_words_vector(words: &[&str]) -> Vec<String> {
// Return a single string. // Return a single string.
// ["hello", " ", "world"] -> "Hello World" // ["hello", " ", "world"] -> "Hello World"
pub fn capitalize_words_string(words: &[&str]) -> String { pub fn capitalize_words_string(words: &[&str]) -> String {
String::new() let mut sentence = String::new();
for x in words {
sentence = sentence.add(capitalize_first(*x).as_str());
}
sentence
} }
#[cfg(test)] #[cfg(test)]

View File

@ -6,8 +6,6 @@
// list_of_results functions. // list_of_results functions.
// Execute `rustlings hint iterators3` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint iterators3` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
#[derive(Debug, PartialEq, Eq)] #[derive(Debug, PartialEq, Eq)]
pub enum DivisionError { pub enum DivisionError {
NotDivisible(NotDivisibleError), NotDivisible(NotDivisibleError),
@ -23,21 +21,27 @@ pub struct NotDivisibleError {
// Calculate `a` divided by `b` if `a` is evenly divisible by `b`. // Calculate `a` divided by `b` if `a` is evenly divisible by `b`.
// Otherwise, return a suitable error. // Otherwise, return a suitable error.
pub fn divide(a: i32, b: i32) -> Result<i32, DivisionError> { pub fn divide(a: i32, b: i32) -> Result<i32, DivisionError> {
todo!(); if b == 0 {
return Err(DivisionError::DivideByZero);
}
if a % b != 0 {
return Err(DivisionError::NotDivisible(NotDivisibleError { dividend: a, divisor: b }));
}
return Ok(a / b);
} }
// Complete the function and return a value of the correct type so the test passes. // Complete the function and return a value of the correct type so the test passes.
// Desired output: Ok([1, 11, 1426, 3]) // Desired output: Ok([1, 11, 1426, 3])
fn result_with_list() -> () { fn result_with_list() -> Result<Vec<i32>, DivisionError> {
let numbers = vec![27, 297, 38502, 81]; let numbers = vec![27, 297, 38502, 81];
let division_results = numbers.into_iter().map(|n| divide(n, 27)); Ok(numbers.into_iter().map(|n| divide(n, 27).unwrap_or(-1)).filter(|n| *n != -1).collect())
} }
// Complete the function and return a value of the correct type so the test passes. // Complete the function and return a value of the correct type so the test passes.
// Desired output: [Ok(1), Ok(11), Ok(1426), Ok(3)] // Desired output: [Ok(1), Ok(11), Ok(1426), Ok(3)]
fn list_of_results() -> () { fn list_of_results() -> Vec<Result<i32, DivisionError>> {
let numbers = vec![27, 297, 38502, 81]; let numbers = vec![27, 297, 38502, 81];
let division_results = numbers.into_iter().map(|n| divide(n, 27)); numbers.into_iter().map(|n| divide(n, 27)).collect()
} }
#[cfg(test)] #[cfg(test)]
@ -53,10 +57,7 @@ mod tests {
fn test_not_divisible() { fn test_not_divisible() {
assert_eq!( assert_eq!(
divide(81, 6), divide(81, 6),
Err(DivisionError::NotDivisible(NotDivisibleError { Err(DivisionError::NotDivisible(NotDivisibleError { dividend: 81, divisor: 6 }))
dividend: 81,
divisor: 6
}))
); );
} }

View File

@ -1,18 +1,10 @@
// iterators4.rs // iterators4.rs
// Execute `rustlings hint iterators4` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint iterators4` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
pub fn factorial(num: u64) -> u64 { pub fn factorial(num: u64) -> u64 {
// Complete this function to return the factorial of num let _not_use: u64 = (1..=num).product();
// Do not use: // result is the same
// - return (1..=num).fold(1, |acc, v| acc * v)
// Try not to use:
// - imperative style loops (for, while)
// - additional variables
// For an extra challenge, don't use:
// - recursion
// Execute `rustlings hint iterators4` for hints.
} }
#[cfg(test)] #[cfg(test)]
@ -28,6 +20,7 @@ mod tests {
fn factorial_of_1() { fn factorial_of_1() {
assert_eq!(1, factorial(1)); assert_eq!(1, factorial(1));
} }
#[test] #[test]
fn factorial_of_2() { fn factorial_of_2() {
assert_eq!(2, factorial(2)); assert_eq!(2, factorial(2));

View File

@ -8,8 +8,6 @@
// need to be modified. // need to be modified.
// Execute `rustlings hint iterators5` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint iterators5` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
use std::collections::HashMap; use std::collections::HashMap;
#[derive(Clone, Copy, PartialEq, Eq)] #[derive(Clone, Copy, PartialEq, Eq)]
@ -30,9 +28,7 @@ fn count_for(map: &HashMap<String, Progress>, value: Progress) -> usize {
} }
fn count_iterator(map: &HashMap<String, Progress>, value: Progress) -> usize { fn count_iterator(map: &HashMap<String, Progress>, value: Progress) -> usize {
// map is a hashmap with String keys and Progress values. map.iter().filter(|entry| *(entry.1) == value).count()
// map = { "variables1": Complete, "from_str": None, ... }
todo!();
} }
fn count_collection_for(collection: &[HashMap<String, Progress>], value: Progress) -> usize { fn count_collection_for(collection: &[HashMap<String, Progress>], value: Progress) -> usize {
@ -48,10 +44,9 @@ fn count_collection_for(collection: &[HashMap<String, Progress>], value: Progres
} }
fn count_collection_iterator(collection: &[HashMap<String, Progress>], value: Progress) -> usize { fn count_collection_iterator(collection: &[HashMap<String, Progress>], value: Progress) -> usize {
// collection is a slice of hashmaps. let mut count = 0;
// collection = [{ "variables1": Complete, "from_str": None, ... }, collection.iter().for_each(|map| { count = count + map.iter().filter(|entry| *(entry.1) == value).count() });
// { "variables2": Complete, ... }, ... ] count
todo!();
} }
#[cfg(test)] #[cfg(test)]

View File

@ -7,9 +7,7 @@
// //
// Execute `rustlings hint lifetimes1` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint lifetimes1` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
fn longest(x: &str, y: &str) -> &str {
if x.len() > y.len() { if x.len() > y.len() {
x x
} else { } else {

View File

@ -6,8 +6,6 @@
// //
// Execute `rustlings hint lifetimes2` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint lifetimes2` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str { fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() { if x.len() > y.len() {
x x
@ -18,9 +16,9 @@ fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
fn main() { fn main() {
let string1 = String::from("long string is long"); let string1 = String::from("long string is long");
let string2 = String::from("xyz");
let result; let result;
{ {
let string2 = String::from("xyz");
result = longest(string1.as_str(), string2.as_str()); result = longest(string1.as_str(), string2.as_str());
} }
println!("The longest string is '{}'", result); println!("The longest string is '{}'", result);

View File

@ -4,11 +4,9 @@
// //
// Execute `rustlings hint lifetimes3` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint lifetimes3` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE struct Book<'a> {
author: &'a str,
struct Book { title: &'a str,
author: &str,
title: &str,
} }
fn main() { fn main() {

View File

@ -1,8 +1,6 @@
// options1.rs // options1.rs
// Execute `rustlings hint options1` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint options1` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
// This function returns how much icecream there is left in the fridge. // This function returns how much icecream there is left in the fridge.
// If it's before 10PM, there's 5 pieces left. At 10PM, someone eats them // If it's before 10PM, there's 5 pieces left. At 10PM, someone eats them
// all, so there'll be no more left :( // all, so there'll be no more left :(

View File

@ -1,8 +1,6 @@
// options2.rs // options2.rs
// Execute `rustlings hint options2` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint options2` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
#[test] #[test]
@ -10,8 +8,7 @@ mod tests {
let target = "rustlings"; let target = "rustlings";
let optional_target = Some(target); let optional_target = Some(target);
// TODO: Make this an if let statement whose value is "Some" type if let Some(word) = optional_target {
word = optional_target {
assert_eq!(word, target); assert_eq!(word, target);
} }
} }
@ -27,9 +24,8 @@ mod tests {
let mut cursor = range; let mut cursor = range;
// TODO: make this a while let statement - remember that vector.pop also adds another layer of Option<T>
// You can stack `Option<T>`s into while let and if let // You can stack `Option<T>`s into while let and if let
integer = optional_integers.pop() { while let Some(Some(integer)) = optional_integers.pop() {
assert_eq!(integer, cursor); assert_eq!(integer, cursor);
cursor -= 1; cursor -= 1;
} }

View File

@ -1,8 +1,6 @@
// options3.rs // options3.rs
// Execute `rustlings hint options3` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint options3` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
struct Point { struct Point {
x: i32, x: i32,
y: i32, y: i32,
@ -12,7 +10,7 @@ fn main() {
let y: Option<Point> = Some(Point { x: 100, y: 200 }); let y: Option<Point> = Some(Point { x: 100, y: 200 });
match y { match y {
Some(p) => println!("Co-ordinates are {},{} ", p.x, p.y), Some(ref p) => println!("Co-ordinates are {},{} ", p.x, p.y),
_ => panic!("no match!"), _ => panic!("no match!"),
} }
y; // Fix without deleting this line. y; // Fix without deleting this line.

View File

@ -14,18 +14,25 @@
// Execute `rustlings hint quiz3` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint quiz3` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE pub trait CardDisplay {
fn print(&self) -> String;
}
pub struct ReportCard { pub struct ReportCard<T> {
pub grade: f32, pub grade: T,
pub student_name: String, pub student_name: String,
pub student_age: u8, pub student_age: u8,
} }
impl ReportCard { impl CardDisplay for ReportCard<f32> {
pub fn print(&self) -> String { fn print(&self) -> String {
format!("{} ({}) - achieved a grade of {}", format!("{} ({}) - achieved a grade of {}", &self.student_name, &self.student_age, &self.grade)
&self.student_name, &self.student_age, &self.grade) }
}
impl CardDisplay for ReportCard<String> {
fn print(&self) -> String {
format!("{} ({}) - achieved a grade of {}", &self.student_name, &self.student_age, &self.grade)
} }
} }
@ -48,9 +55,8 @@ mod tests {
#[test] #[test]
fn generate_alphabetic_report_card() { fn generate_alphabetic_report_card() {
// TODO: Make sure to change the grade here after you finish the exercise.
let report_card = ReportCard { let report_card = ReportCard {
grade: 2.1, grade: "A+".to_string(),
student_name: "Gary Plotter".to_string(), student_name: "Gary Plotter".to_string(),
student_age: 11, student_age: 11,
}; };

View File

@ -7,12 +7,10 @@
// pass! Make the test fail! // pass! Make the test fail!
// Execute `rustlings hint tests1` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint tests1` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
#[test] #[test]
fn you_can_assert() { fn you_can_assert() {
assert!(); assert!(1 == 1);
} }
} }

View File

@ -3,12 +3,10 @@
// pass! Make the test fail! // pass! Make the test fail!
// Execute `rustlings hint tests2` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint tests2` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
#[test] #[test]
fn you_can_assert_eq() { fn you_can_assert_eq() {
assert_eq!(); assert_eq!(1, 1);
} }
} }

View File

@ -4,8 +4,6 @@
// we expect to get when we call `is_even(5)`. // we expect to get when we call `is_even(5)`.
// Execute `rustlings hint tests3` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint tests3` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
pub fn is_even(num: i32) -> bool { pub fn is_even(num: i32) -> bool {
num % 2 == 0 num % 2 == 0
} }
@ -16,11 +14,11 @@ mod tests {
#[test] #[test]
fn is_true_when_even() { fn is_true_when_even() {
assert!(); assert!(is_even(16));
} }
#[test] #[test]
fn is_false_when_odd() { fn is_false_when_odd() {
assert!(); assert!(!is_even(17));
} }
} }

View File

@ -2,11 +2,9 @@
// Make sure that we're testing for the correct conditions! // Make sure that we're testing for the correct conditions!
// Execute `rustlings hint tests4` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint tests4` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
struct Rectangle { struct Rectangle {
width: i32, width: i32,
height: i32 height: i32,
} }
impl Rectangle { impl Rectangle {
@ -15,7 +13,7 @@ impl Rectangle {
if width <= 0 || height <= 0 { if width <= 0 || height <= 0 {
panic!("Rectangle width and height cannot be negative!") panic!("Rectangle width and height cannot be negative!")
} }
Rectangle {width, height} Rectangle { width, height }
} }
} }
@ -27,17 +25,19 @@ mod tests {
fn correct_width_and_height() { fn correct_width_and_height() {
// This test should check if the rectangle is the size that we pass into its constructor // This test should check if the rectangle is the size that we pass into its constructor
let rect = Rectangle::new(10, 20); let rect = Rectangle::new(10, 20);
assert_eq!(???, 10); // check width assert_eq!(rect.width, 10); // check width
assert_eq!(???, 20); // check height assert_eq!(rect.height, 20); // check height
} }
#[test] #[test]
#[should_panic]
fn negative_width() { fn negative_width() {
// This test should check if program panics when we try to create rectangle with negative width // This test should check if program panics when we try to create rectangle with negative width
let _rect = Rectangle::new(-10, 10); let _rect = Rectangle::new(-10, 10);
} }
#[test] #[test]
#[should_panic]
fn negative_height() { fn negative_height() {
// This test should check if program panics when we try to create rectangle with negative height // This test should check if program panics when we try to create rectangle with negative height
let _rect = Rectangle::new(10, -10); let _rect = Rectangle::new(10, -10);

View File

@ -9,14 +9,16 @@
// implementing this trait. // implementing this trait.
// Execute `rustlings hint traits1` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint traits1` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE use std::ops::Add;
trait AppendBar { trait AppendBar {
fn append_bar(self) -> Self; fn append_bar(self) -> Self;
} }
impl AppendBar for String { impl AppendBar for String {
// TODO: Implement `AppendBar` for type `String`. fn append_bar(self) -> Self {
self.add("Bar")
}
} }
fn main() { fn main() {

View File

@ -11,13 +11,18 @@
// you can do this! // you can do this!
// Execute `rustlings hint traits2` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint traits2` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE use std::vec;
trait AppendBar { trait AppendBar {
fn append_bar(self) -> Self; fn append_bar(self) -> Self;
} }
// TODO: Implement trait `AppendBar` for a vector of strings. impl AppendBar for Vec<String> {
fn append_bar(mut self) -> Self {
self.push(String::from("Bar"));
self
}
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {

View File

@ -7,10 +7,10 @@
// Consider what you can add to the Licensed trait. // Consider what you can add to the Licensed trait.
// Execute `rustlings hint traits3` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint traits3` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
pub trait Licensed { pub trait Licensed {
fn licensing_info(&self) -> String; fn licensing_info(&self) -> String {
String::from("Some information")
}
} }
struct SomeSoftware { struct SomeSoftware {

View File

@ -4,8 +4,6 @@
// Don't change any line other than the marked one. // Don't change any line other than the marked one.
// Execute `rustlings hint traits4` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint traits4` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
pub trait Licensed { pub trait Licensed {
fn licensing_info(&self) -> String { fn licensing_info(&self) -> String {
"some information".to_string() "some information".to_string()
@ -17,10 +15,11 @@ struct SomeSoftware {}
struct OtherSoftware {} struct OtherSoftware {}
impl Licensed for SomeSoftware {} impl Licensed for SomeSoftware {}
impl Licensed for OtherSoftware {} impl Licensed for OtherSoftware {}
// YOU MAY ONLY CHANGE THE NEXT LINE // YOU MAY ONLY CHANGE THE NEXT LINE
fn compare_license_types(software: ??, software_two: ??) -> bool { fn compare_license_types(software: impl Licensed, software_two: impl Licensed) -> bool {
software.licensing_info() == software_two.licensing_info() software.licensing_info() == software_two.licensing_info()
} }

View File

@ -4,8 +4,6 @@
// Don't change any line other than the marked one. // Don't change any line other than the marked one.
// Execute `rustlings hint traits5` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint traits5` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
pub trait SomeTrait { pub trait SomeTrait {
fn some_function(&self) -> bool { fn some_function(&self) -> bool {
true true
@ -19,15 +17,19 @@ pub trait OtherTrait {
} }
struct SomeStruct {} struct SomeStruct {}
struct OtherStruct {} struct OtherStruct {}
impl SomeTrait for SomeStruct {} impl SomeTrait for SomeStruct {}
impl OtherTrait for SomeStruct {} impl OtherTrait for SomeStruct {}
impl SomeTrait for OtherStruct {} impl SomeTrait for OtherStruct {}
impl OtherTrait for OtherStruct {} impl OtherTrait for OtherStruct {}
// YOU MAY ONLY CHANGE THE NEXT LINE // YOU MAY ONLY CHANGE THE NEXT LINE
fn some_func(item: ??) -> bool { fn some_func(item: impl SomeTrait + OtherTrait) -> bool {
item.some_function() && item.other_function() item.some_function() && item.other_function()
} }

Binary file not shown.