More than 1 year has passed since last update.
Rust 100 Ex ๐ใ24/37ใ ๅฏๅคในใฉใคในใปไธๆธใๆง้ ไฝ ๏ฝๆง้ ไฝใง็ถๆ ่กจ็พ๏ฝ
ๅใฎ่จไบ
- ใ0ใ ๆบๅ โ ๅๅ
- ...
-
ใ23ใ
impl Traitใปในใฉใคใน ๏ฝ้ ๅใฎๆฌ ็๏ฝ โ ๅๅ - ใ24ใ ๅฏๅคในใฉใคในใปไธๆธใๆง้ ไฝ ๏ฝๆง้ ไฝใง็ถๆ ่กจ็พ๏ฝ โ ไปๅ
100 Exercise To Learn Rust ๆผ็ฟ็ฌฌ24ๅใซใชใใพใ๏ผ
ไปๅใฎ้ข้ฃใใผใธ
[06_ticket_management/11_mutable_slices] ๅฏๅคในใฉใคใน
ๅ้กใฏใใกใใงใใ
// TODO: Define a function named `lowercase` that converts all characters in a string to lowercase,
// modifying the input in place.
// Does it need to take a `&mut String`? Does a `&mut str` work? Why or why not?
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn empty() {
let mut s = String::from("");
lowercase(&mut s);
assert_eq!(s, "");
}
#[test]
fn one_char() {
let mut s = String::from("A");
lowercase(&mut s);
assert_eq!(s, "a");
}
#[test]
fn multiple_chars() {
let mut s = String::from("Hello, World!");
lowercase(&mut s);
assert_eq!(s, "hello, world!");
}
#[test]
fn mut_slice() {
let mut s = "Hello, World!".to_string();
lowercase(s.as_mut_str());
assert_eq!(s, "hello, world!");
}
}
ใณใกใณใใ่ฆ็ดใใใจใใใชๆใใงใใ
- TODO: ๅ
จๆๅญใๅฐๆๅญใซใใ
lowercase้ขๆฐใๅฎ็พฉใใฆใใ ใใ- ๅ ฅๅ่ชไฝใไฟฎ้ฃพใใพใ(ใคใพใๅฏๅคๅ็ งใๅใๅใ)
-
&mut Stringใจ&mut strใฉใกใใงๅใๅใใจ่ฏใใใใงใใใใ๏ผใใฎ็็ฑใฏ๏ผ
็็ฑใพใง่ใใใฆใใใฎใง่งฃ่ชฌใงใฏ็็ฑใๅ็ญใใใใชใจๆใใพใใ
่งฃ่ชฌ
ๅๅใฏในใฉใคใน &[T] ใ็ปๅ ดใใๅใงใใ๏ผไธๅคๅ็
งใซใคใใฆใฏ้็็ณป([T;N], &'static str)ใปใใผใ็ณป(Vec<T>, String)ๅใใๅใๅใใ &[T] ใ &str ใ่ฏใใจใใใฆใใพใใใใใงใฏๅฏๅคๅ็
งใงใใใใใๆนใ่ฏใใฎใ๏ผใจใใๅ้กใงใ Book ใฎๆนใงใฏใใใใจใฏ้ใใชใใใจใใฃใ่ถฃๆจใฎ่ชฌๆใใชใใใฆใใพใใ
ๆฌๅ้กใธใฎๅ็ญใฏๆฌกใฎใใใชๆใใงใใ &mut str ใใใชใใก str ๅใไฝฟ็จใใๆนใ้ธๆใใพใใใ
fn lowercase(s: &mut str) {
// fn lowercase(s: &mut String) { // ใฉใฃใก๏ผใจใใๅ้กใงใใกใใฏ้ธใฐใชใใฃใ
s.make_ascii_lowercase();
}
ไปฅไธใ็็ฑใงใใ(ไฝใ่พผใใ ใฎใงๅ ่ฆใใใงใ)
-
&mut strใฏmake_ascii_lowercaseใกใฝใใใๆใฃใฆใใใใใๅผๆฐใ&mut strใจใใฆๅใๅใใใจใงใๆฌๅฆ็ใๅฎ็พใงใใพใใ(&mut strใๅผๆฐใซๅใใๅๅๆงใฎ่ชฌๆ)- ใใใใ
&'static strๅใจใใฆๆฑใใใๆๅญๅใชใใฉใซใฏ(ๅฐใชใใจใ safe Rust ใงใฏ)ๅฏๅคใๅใใชใใใใ&mut Stringใๅใๅใฃใฆใใใฐใปใจใใฉใฎใฑใผในใงใฏๅฐใใพใใใ
- ใใใใ
- ๆฌใจใฏใตใตใคใบใงใฏใในใใฑใผในใซใฆ
&mut strใ่ฟใas_mut_strใกใฝใใใๅผใฐใใฆใใใฎใงใ&mut strใๅผๆฐๅใจใใฆ็จใใชใใใฐใชใใพใใใ (&mut strใๅผๆฐๅใจใใฆๅใๅใใชใใใฐใชใใชใใจใใๅฟ ่ฆๆงใฎ่ชฌๆ)
ใฆใผในใฑใผในใ่ใใใฐ &mut String ใงใ่ฏใใ ใใใใฉใๅ้กใฎ็ญใใจใใฆใฏ &mut str ใจใใฆๅใๅใไปใชใใจใใ่ชฌๆใงใใใใพใ &mut String ใ ใจ้ขๆฐๅ
ใงไฝใใใใใใใใชใใใๅฉ็จ่
็ฎ็ทใ ใจใงใใใใจใๅถ้ใใใ &mut str ใฎๆนใๅฌใใใจใใ่ใๆนใใใใพใใใ้ขๆฐใไฝใใฎใไฝฟใใฎใ่ชๅใชใ &mut String ใง่ฏใใจๆใใพใใญใ
[06_ticket_management/12_two_states] ไธๆธใๆง้ ไฝ(ในใใผใใงๆง้ ไฝใๅใใ)
ๅ้กใฏใใกใใงใใ
// TODO: Update `add_ticket`'s signature: it should take a `TicketDraft` as input
// and return a `TicketId` as output.
// Each ticket should have a unique id, generated by `TicketStore`.
// Feel free to modify `TicketStore` fields, if needed.
//
// You also need to add a `get` method that takes as input a `TicketId`
// and returns an `Option<&Ticket>`.
use ticket_fields::{TicketDescription, TicketTitle};
#[derive(Clone)]
pub struct TicketStore {
tickets: Vec<Ticket>,
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct TicketId(u64);
#[derive(Clone, Debug, PartialEq)]
pub struct Ticket {
pub id: TicketId,
pub title: TicketTitle,
pub description: TicketDescription,
pub status: Status,
}
#[derive(Clone, Debug, PartialEq)]
pub struct TicketDraft {
pub title: TicketTitle,
pub description: TicketDescription,
}
#[derive(Clone, Debug, Copy, PartialEq)]
pub enum Status {
ToDo,
InProgress,
Done,
}
impl TicketStore {
pub fn new() -> Self {
Self {
tickets: Vec::new(),
}
}
// ใใใซๆนๅคใๅฟ
่ฆ
pub fn add_ticket(&mut self, ticket: Ticket) {
self.tickets.push(ticket);
}
}
#[cfg(test)]
mod tests {
use crate::{Status, TicketDraft, TicketStore};
use ticket_fields::test_helpers::{ticket_description, ticket_title};
#[test]
fn works() {
let mut store = TicketStore::new();
let draft1 = TicketDraft {
title: ticket_title(),
description: ticket_description(),
};
let id1 = store.add_ticket(draft1.clone());
let ticket1 = store.get(id1).unwrap();
assert_eq!(draft1.title, ticket1.title);
assert_eq!(draft1.description, ticket1.description);
assert_eq!(ticket1.status, Status::ToDo);
let draft2 = TicketDraft {
title: ticket_title(),
description: ticket_description(),
};
let id2 = store.add_ticket(draft2);
let ticket2 = store.get(id2).unwrap();
assert_ne!(id1, id2);
}
}
ใใฑใใใใใผใธใฃใไฝใใใผใใซๆปใฃใฆใใพใใใ Vec<Ticket> ใซๆฐใใชใใฑใใใๅ ใใ add_ticket ใกใฝใใใใใใพใใใใไปๅใใ Ticket ๆง้ ไฝใใ่ชไฝใงใฏใชใใใฎไธๆธใใงใใ TicketDraft ๆง้ ไฝใๅผๆฐใจใใฆๅใใIDใ่ฟใใใใซๆนๅคใใใคใใงใซในใใขใใIDใงใใฑใใใใชใใทใงใใซใซๅๅพใใ get ใกใฝใใใๅฎ็พฉใใใใจใใๅ้กใงใใ
่งฃ่ชฌ
ๆ็คบ้ใๅผๆฐใฎๅใ Ticket ใใใ id ใจ status ใใชใใใใใใฆใใ TicketDraft ใซๅคๆดใใๆๅพใซIDใ่ฟใใใใซๆนๅคใใใฐใ๏ฝใงใ๏ผ
impl TicketStore {
// ...็็ฅ...
pub fn add_ticket(&mut self, ticket_draft: TicketDraft) -> TicketId {
let TicketDraft { title, description } = ticket_draft;
let id = TicketId(self.tickets.len() as _);
let ticket = Ticket {
title,
id,
description,
status: Status::ToDo,
};
self.tickets.push(ticket);
id
}
fn get(&self, id: TicketId) -> Option<&Ticket> {
self.tickets.iter().find(|t| t.id == id)
}
}
id ใฏใ็พๅจใฎๅ็้
ๅใฎใตใคใบใๆธกใใใจใงไฝๆใใใใจใซใใพใใใใใฎๆนๆณใชใ่ก็ชใใพใใใTicketId ใ u64 ใ่ฆๆฑใใไธๆนใงใ .len() ใฏ usize ๅใ่ฟใใฎใงใญใฃในใใใฆใใพใใ(ใญใฃในใๅ
ใฎๅใๆจ่ซใงใใๆใฏ as _ ใจๆธใใ ใใง่ฏใใฆไพฟๅฉ)
status ใฏไฝๆๆ็นใงใฏ ToDo ใจๆฑบใๆใกใใฆใใพใใ
get ใกใฝใใใงใฏใใจใใใใไปๅใฏ find ใกใฝใใใไฝฟใใใจใงๆๅใซ id ใไธ่ดใใใใฎใ่ฟใใจใใ้ขจใซใใพใใใ( O(N) ใใใใฎใใชใใจใใใใฎใใพใใซๆฌกๅไปฅ้ใฎ่ฉฑ้กใงใ๏ผ)
ไปๅใฏ็ฎๆฐใใ่ฉฑ้กใๆ่ก็ใซ้ฃใใๅ ๅฎนใฏใใใพใใใงใใใญใใใใฏใใใจใใฆBookใฎๅ ๅฎนใฏไปๅใ้ข็ฝใใงใใ
id ใNULLABLEใซใใไปฃใใใซใ Ticket ใจ TicketDraft ใจใใๅฝขใงในใใผใใงๅใใฆ็ฎก็ใใใใจใงไธๆญฃใชใชใใธใงใฏใ(็็ผใใชใใธใงใฏใ)ใฎ็ๆใ้ฒใใใจใใใฎใฏใทใณใใซใงใใไธญใ
่ๅณๆทฑใใงใใๆ็ต็ใซใฏ็ใใใพใใใใพใ Option ๅใซใใชใใใฐ่กจ็พใงใใชใ id ใใฃใผใซใใ็บ่ฆใใใใใใใใ็็ผใใชใใธใงใฏใใ้ฒใใใใซๆง้ ไฝใๅใใใปใใ่ฏใใใจใใๆฐไปใใๅพใใใใจใใๆตใใฏใNULLๅฎๅ
จใงใใใใจใงๅใใฆๆฐใฅใใใใใชใ้จๅใงใใใใ
ใในใใผใใงๆง้ ไฝใๅใใฆใใพใใใใจใใใฎใฏใใฏใฉในใ็กใใใๆง้ ไฝใฎๅฎ็พฉใซๅฏพใใฆใใ่ปฝใงใ Option ๅใใใใใใใใใฉใ็ใใใใจใใใใจใงใRustใชใใงใฏใฎ่ใๆนใชใใใใชใใใจๅไบบ็ใซใฏๆใใพใ๏ผ
ใงใฏๆฌกใฎๅ้กใซ่กใใพใใใ๏ผ
ๆฌกใฎ่จไบ: ใ25ใ ใคใณใใใฏในใปๅฏๅคใคใณใใใฏใน ๏ฝใคใณใใใฏในใใใฌใคใ๏ผ๏ฝ
Register as a new user and use Qiita more conveniently
- You get articles that match your needs
- You can efficiently read back useful information
- You can use dark theme
