rustlings/exercises/quiz2.rs
2024-02-18 16:33:16 +08:00

89 lines
2.8 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// quiz2.rs
//
// This is a quiz for the following sections:
// - Strings
// - Vecs
// - Move semantics
// - Modules
// - Enums
//
// Let's build a little machine in the form of a function. As input, we're going
// to give a list of strings and commands. These commands determine what action
// is going to be applied to the string. It can either be:
// - Uppercase the string
// - Trim the string
// - Append "bar" to the string a specified amount of times
// The exact form of this will be:
// - The input is going to be a Vector of a 2-length tuple,
// the first element is the string, the second one is the command.
// - The output element is going to be a Vector of strings.
//
// No hints this time!
#[derive(Debug,PartialEq)]
pub enum Command {
Uppercase,
Trim,
Append(usize),
}
mod my_module {
use super::Command;
// TODO: Complete the function signature!
pub fn transformer(input: Vec<(String,Command)>)-> Vec<String> {
// TODO: Complete the output declaration!
let mut output:Vec<String> = vec![];
for (string, command) in input.iter() {
// TODO: Complete the function body. You can do it!
match command{
Command::Uppercase=>{
output.push(string.to_uppercase())
}
Command::Trim=>{
output.push(string.trim().to_string())
}
Command::Append(size)=>{
// let mut ap = string.clone();
// for _ in 0..*size {
// ap.push_str("bar");
// }
// output.push(ap);
let repeated_bar: String = if *size == 1 {
String::from("bar")
} else {
//这里如果是这样写的话需要排除1否则无法正确凭借只有当重复时候可以使用repeat
std::iter::repeat("bar").take(*size).collect()
};
let result = string.clone() + &repeated_bar;
output.push(result);
}
}
}
output
}
}
#[cfg(test)]
mod tests {
// TODO: What do we need to import to have `transformer` in scope?
use super::my_module::transformer;
use super::Command;
#[test]
fn it_works() {
let output = transformer(vec![
("hello".into(), Command::Uppercase),
(" all roads lead to rome! ".into(), Command::Trim),
("foo".into(), Command::Append(1)),
("bar".into(), Command::Append(5)),
]);
assert_eq!(output[0], "HELLO");
assert_eq!(output[1], "all roads lead to rome!");
assert_eq!(output[2], "foobar");
assert_eq!(output[3], "barbarbarbarbarbar");
}
}