VOOZH about

URL: https://qiita.com/namn1125/items/a9acc7dc2ca7c4c55cc3

โ‡ฑ Rust 100 Ex ๐Ÿƒใ€24/37ใ€‘ ๅฏๅค‰ใ‚นใƒฉใ‚คใ‚นใƒปไธ‹ๆ›ธใๆง‹้€ ไฝ“ ๏ฝžๆง‹้€ ไฝ“ใง็Šถๆ…‹่กจ็พ๏ฝž #Rust - Qiita


๐Ÿ‘ Image
1

Go to list of users who liked

0

Share on X(Twitter)

Share on Facebook

Add to Hatena Bookmark

More than 1 year has passed since last update.

@namn1125(namnium)in๐Ÿ‘ Image
ใ‚†ใ‚ใฟ

Rust 100 Ex ๐Ÿƒใ€24/37ใ€‘ ๅฏๅค‰ใ‚นใƒฉใ‚คใ‚นใƒปไธ‹ๆ›ธใๆง‹้€ ไฝ“ ๏ฝžๆง‹้€ ไฝ“ใง็Šถๆ…‹่กจ็พ๏ฝž

1
Last updated at Posted at 2024-07-17

ๅ‰ใฎ่จ˜ไบ‹

100 Exercise To Learn Rust ๆผ”็ฟ’็ฌฌ24ๅ›žใซใชใ‚Šใพใ™๏ผ

ไปŠๅ›žใฎ้–ข้€ฃใƒšใƒผใ‚ธ

[06_ticket_management/11_mutable_slices] ๅฏๅค‰ใ‚นใƒฉใ‚คใ‚น

ๅ•้กŒใฏใ“ใกใ‚‰ใงใ™ใ€‚

lib.rs
// 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 ๅž‹ใ‚’ไฝฟ็”จใ™ใ‚‹ๆ–นใ‚’้ธๆŠžใ—ใพใ—ใŸใ€‚

lib.rs
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] ไธ‹ๆ›ธใๆง‹้€ ไฝ“(ใ‚นใƒ†ใƒผใƒˆใงๆง‹้€ ไฝ“ใ‚’ๅˆ†ใ‘ใ‚‹)

ๅ•้กŒใฏใ“ใกใ‚‰ใงใ™ใ€‚

lib.rs
// 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ใ‚’่ฟ”ใ™ใ‚ˆใ†ใซๆ”นๅค‰ใ™ใ‚ŒใฐใŠ๏ฝ‹ใงใ™๏ผ

lib.rs
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ใ€‘ ใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใƒปๅฏๅค‰ใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚น ๏ฝžใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใ‚‚ใƒˆใƒฌใ‚คใƒˆ๏ผ๏ฝž

1

Go to list of users who liked

0
0

Go to list of comments

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1

Go to list of users who liked

0