uz
Feedback
ToCode

ToCode

Kanalga Telegramโ€™da oโ€˜tish

ื˜ื™ืคื™ื ืงืฆืจื™ื ืœืžืชื›ื ืชื™ื ืžืืช ื™ื ื•ืŸ ืคืจืง

Ko'proq ko'rsatish
1 420
Obunachilar
Ma'lumot yo'q24 soatlar
+27 kunlar
-230 kunlar
Postlar arxiv
ToCode
1 420
# ื™ื•ื 7 - ืคื™ืชื•ื— ืžืžืฉืง ื’ืจืคื™ ืœืžืฉื—ืง Snake ื‘ Rust ื–ื•ื›ืจื™ื ืืช ืžืฉื—ืง ืกื ื™ื™ืง ืžืืชืžื•ืœ? ืื– ื”ื™ื•ื ื ื›ืชื•ื‘ ืžืžืฉืง ื’ืจืคื™ ื›ื“ื™ ืฉื ื•ื›ืœ ืœืฉื—ืง ื‘ื•. ## ืžื” ืื ื—ื ื• ื‘ื•ื ื™ื ื”ืžืฆื‘ ืฉืœ ืคื™ืชื•ื— ืžืžืฉืงื™ื ื’ืจืคื™ื™ื ื‘ Rust ืœื ืžื–ื”ื™ืจ: ื™ืฉ ืžื•ื“ื•ืœื™ื ืฉื™ื•ื“ืขื™ื ืœื—ื‘ืจ ืชื•ื›ื ื™ืช Rust ืœืกืคืจื™ื•ืช GUI ืงื™ื™ืžื•ืช ืžืฉืคื•ืช ืื—ืจื•ืช (ืœืžืฉืœ rust-qt, gtk-rs ืื• fltk-rs), ืื‘ืœ ื”ื“ื‘ืจื™ื ืฉื ื›ืชื‘ื• ืžืืคืก ื‘ืจืืกื˜ ืขื“ื™ื™ืŸ ืœื ื‘ืฉืœื™ื, ื•ื’ื ืœื ื‘ืจื•ืจ ืื ืื™ ืคืขื Rust ื”ื•ืœื›ืช ืœืฉืžืฉ ื›ืฉืคื” ืœืคื™ืชื•ื— ื™ื™ืฉื•ืžื™ื ื’ืจืคื™ื™ื. ื›ื™ื•ื•ืŸ ืื—ื“ ืฉื›ืŸ ืื ืฉื™ื ื‘ื•ื ื™ื ื‘ Rust ื”ื•ื ืžืžืฉืงื™ ื•ื•ื‘ ื‘ืขื–ืจืช ืงื•ืžืคื™ืœืฆื™ื” ืœ Web Assembly, ืื‘ืœ ื–ื” ืœื ืžื” ืฉืจืฆื™ืชื™ ืœื‘ื ื•ืช ื”ื™ื•ื. ื›ื™ื•ื•ืŸ ืื—ืจ ืฉืขื•ื‘ื“ ื‘ Rust ื”ื•ื ื›ืœื™ ืฉื•ืจืช ืคืงื•ื“ื”, ื•ื‘ืžื™ื•ื—ื“ ื›ืœื™ื ืฉืžืฆื™ื’ื™ื ืžืžืฉืงื™ื "ื’ืจืคื™ื™ื" ืžื‘ื•ืกืกื™ ื˜ืงืกื˜, ื•ืกืคืจื™ื” ืื—ืช ืฉืจืื™ืชื™ ืฉื”ื™ืชื” ืคื•ืคื•ืœืจื™ืช ื‘ื”ืจื‘ื” ืคืจื•ื™ืงื˜ื™ื ื”ื™ื ืกืคืจื™ื™ืช cursive, ืฉืžืืคืฉืจืช ืœื‘ื ื•ืช ืžืžืฉืง ื˜ืงืกื˜ื•ืืœื™ ืžื‘ื•ืกืก ncurses ืœืชื•ื›ื ื™ื•ืช. ื–ื” ืื•ืžืจ ืฉื”ื ื—ืฉ ืฉืœื ื• ื™ืงื‘ืœ ืžืจืื” ืจื˜ืจื• ื•ื™ื”ื™ื” ืžื•ืจื›ื‘ ืžื˜ืงืกื˜ ื‘ืœื‘ื“, ืื‘ืœ ื–ื” ื—ืœืง ืžื”ื›ื™ืฃ. ## ืงืฆืช ืขืœ Cursive ืœ cursive ื™ืฉ ืžื“ืจื™ืš ืœืžืชื—ื™ืœื™ื ืฉืœื™ ืžืื•ื“ ืขื–ืจ, ืืคืฉืจ ืœืžืฆื•ื ืื•ืชื• ื‘ืฉืœื•ืฉื” ื—ืœืงื™ื ื‘ืงื™ืฉื•ืจื™ื: https://github.com/gyscos/cursive/blob/main/doc/tutorial_1.md https://github.com/gyscos/cursive/blob/main/doc/tutorial_2.md https://github.com/gyscos/cursive/blob/main/doc/tutorial_3.md ื–ืืช ืœื“ื•ื’ืžื” ืชื•ื›ื ื™ืช Hello World ืคืฉื•ื˜ื” ืžืื•ืชื• ื”ืžื“ืจื™ืš:
use cursive::views::TextView;

fn main() {
 let mut siv = cursive::default();

 siv.add_global_callback('q', |s| s.quit());

 siv.add_layer(TextView::new("Hello cursive! Press <q> to quit."));

 siv.run();
}
ืฉื™ืžื• ืœื‘ ืื™ืš ื›ืœ ื“ื‘ืจ ื‘ Cursive ื”ื•ื View - ืื ื—ื ื• ื™ื•ืฆืจื™ื ืžืฉื”ื• ืฉื ืงืจื TextView, ืžืขื‘ื™ืจื™ื ืœื• ืžื—ืจื•ื–ืช ื˜ืงืกื˜ ื•ื‘ืกื•ืฃ ืžืคืขื™ืœื™ื siv.run ื›ื“ื™ "ืœื”ืชื—ื™ืœ" ืืช ื”ืชื•ื›ื ื™ืช. ื”ืคืงื•ื“ื” run ื—ื•ื–ืจืช ืจืง ื›ืฉื™ื•ืฆืื™ื ืžื”ืžืžืฉืง ื”ื˜ืงืกื˜ื•ืืœื™, ื•ื”ืชื•ื›ื ื™ืช ื›ื•ืœื” ืžืฆื™ื’ื” ื‘ืืžืฆืข ื”ืžืกืš ืืช ื”ื˜ืงืกื˜ ื•ืžื—ื›ื” ืขื“ ืฉื ืœื—ืฅ q ื›ื“ื™ ืœื—ื–ื•ืจ ืœืžืกื•ืฃ. ## ืžืžืฉืง ื’ืจืคื™ ืœื ื—ืฉ ื‘ืชื•ื›ื ื™ืช ืฉืœื ื• ืื ื—ื ื• ื’ื ื ื‘ื ื” View, ืื‘ืœ ื”ื•ื ืœื ื™ื”ื™ื” TextView ืืœื View ืžื•ืชืื ืื™ืฉื™ืช ืฉืื ื™ ื‘ื•ื ื” ืœื‘ื“. ื‘ืฉื‘ื™ืœ ืœื‘ื ื•ืช ื›ื–ื” ืื ื™ ืฆืจื™ืš ืœืžืžืฉ ืคื•ื ืงืฆื™ื” ื‘ืฉื draw, ืฉืžืงื‘ืœืช ืื•ื‘ื™ืงื˜ ื‘ืฉื Printer ื•ื™ื›ื•ืœื” ืœื”ืฉืชืžืฉ ื‘ื• ื›ื“ื™ ืœืฆื™ื™ืจ ื“ื‘ืจื™ื ืขืœ ื”ืžืกืš. ื”ื ื” ื”ืžื™ืžื•ืฉ ืฉืœื™ ืฉืžืฆื™ื™ืจ ืืช ื”ื ื—ืฉ, ื‘ื”ืชื‘ืกืก ืขืœ ื”ืกื˜ืจืืงื˜ ืฉืœ ื”ืžืฉื—ืง ืฉื›ืชื‘ื ื• ืืชืžื•ืœ:
fn draw(&self, printer: &Printer) {
    printer.print(self.board.snake.front().unwrap(), match self.direction {
        Direction::Up => "^",
        Direction::Down => "V",
        Direction::Left => "<",
        Direction::Right => ">",
    });
    for snake_pos in self.board.snake.iter().skip(1) {
        printer.print(snake_pos, "X");
    }

    printer.print(self.board.apple, "O");
}
ืื ื™ ืžืกืชื›ืœ ืขืœ ื”ื›ื™ื•ื•ืŸ ืืœื™ื• ืื ื—ื ื• ื”ื•ืœื›ื™ื ื•ืœืคื™ ื”ื›ื™ื•ื•ืŸ ืžืฆื™ื™ืจ ืืช ื”ืกื™ืžืŸ ืขื‘ื•ืจ ืจืืฉ ื”ื ื—ืฉ. ืื—ืจื™ ื–ื” ืื ื™ ืžืžืฉื™ืš ื•ืžืฆื™ื™ืจ X-ื™ื ืœื›ืœ ื”ื’ื•ืฃ ืฉืœ ื”ื ื—ืฉ, ื•ืืช ื”ืื•ืช O ื‘ืงื•ืื•ืจื“ื™ื ื˜ื•ืช ืฉืœ ื”ืชืคื•ื—. ื ืฉืืจ ืœื ื• ืจืง ืœื•ื•ื“ื ืฉื›ืœ ืฉื ื™ื” ืชื•ืคืขืœ ื”ืคื•ื ืงืฆื™ื” step ืฉืœ ื”ืžืฉื—ืง, ื•ืื—ืจื™ ื–ื” ืชื•ืคืขืœ ืžื—ื“ืฉ draw. ืื”, ื•ื’ื ืœื˜ืคืœ ื‘ืœื—ื™ืฆื•ืช ืขืœ ื”ืžืงืœื“ืช ื›ื“ื™ ืœืฉื ื•ืช ืืช ื›ื™ื•ื•ืŸ ื”ื ื—ืฉ. ## ื˜ื™ืคื•ืœ ื‘ืื™ืจื•ืขื™ื ื”ืคื•ืงืฆื™ื” on_event ืฉืœ View ืื—ืจืื™ืช ืขืœ ื˜ื™ืคื•ืœ ื‘ืื™ืจื•ืขื™ื, ื•ื”ืื™ืจื•ืข ื”ื™ื—ื™ื“ ืฉืžืขื ื™ื™ืŸ ืื•ืชื ื• ื ืงืจื Key, ื›ืœื•ืžืจ ืœื—ื™ืฆื” ืขืœ ื›ืคืชื•ืจ ื‘ืžืงืœื“ืช. ื”ื ื” ื”ืžื™ืžื•ืฉ ืฉื‘ื•ื—ืจ ืขืจืš ื—ื“ืฉ ืœ self.direction ืœืคื™ ื”ื›ืคืชื•ืจ ืฉื ืœื—ืฅ:
fn on_event(&mut self, event: Event) -> EventResult {
    match event {
        Event::Key(key) => {
            self.direction = match key {
                Key::Down => Direction::Down,
                Key::Up => Direction::Up,
                Key::Left => Direction::Left,
                Key::Right => Direction::Right,
                _ => self.direction,
            };
            self.step();
        }
        _ => (),
    }
    EventResult::Ignored
}
## ืขื‘ื•ื“ื” ื‘ืจืงืข ื‘ Cursive

ToCode
1 420
ื”ืจื‘ื” ืžื” ืœืงืจื•ื ื›ืืŸ, ืื– ื‘ื•ืื• ื ื“ื‘ืจ ืขืœ ื”ื“ื‘ืจื™ื ื”ืžืจื›ื–ื™ื™ื: 1. ืื ื™ ืžื’ื“ื™ืจ ืืช ื”ื ื—ืฉ ื‘ืชื•ืจ ืจืฉื™ืžื” ืžืงื•ืฉืจืช, ื›ื“ื™ ืฉื™ื”ื™ื” ืงืœ ืœืžื—ื•ืง ืืช ื”ื—ื•ืœื™ื” ื”ืื—ืจื•ื ื” ื•ืœื”ื•ืกื™ืฃ ื—ื•ืœื™ื” ืœืจืืฉ (ื›ืœื•ืžืจ ืœื–ื•ื–). ื”ืคื•ื ืงืฆื™ื” ืžืชื—ื™ืœื” ื‘ืœืงื™ื—ืช ื”ืขืจืš ื”ืจืืฉื•ืŸ ืžืื•ืชื” ืจืฉื™ืžื”, ื›ืœื•ืžืจ ืจืืฉ ื”ื ื—ืฉ. ืื ื™ ื™ื•ื“ืข ืฉื”ื•ื ื—ื™ื™ื‘ ืœื”ื™ื•ืช ืฉื ื•ืœื›ืŸ ืœื ืžื•ื“ืื’ ืžื”ืฉื™ืžื•ืฉ ื‘ unwrap ื›ื“ื™ ืœืงื‘ืœ ืืช ื”ืขืจืš. 2. ื‘ืขื–ืจืช match ืื ื™ ื‘ื•ื ื” ืืช next_head ืœื”ื™ื•ืช ื”ืžื™ืงื•ื ื”ื‘ื ืฉืœ ื”ื ื—ืฉ. 3. ืื ื™ ื‘ื•ื“ืง ืื ื”ื ื—ืฉ ื™ืฆื ืžื”ืœื•ื—, ื•ืื ื›ืŸ ืžื—ื–ื™ืจ false. 4. ืžื•ืกื™ืฃ ืืช ื”ืžื™ืงื•ื ื”ื—ื“ืฉ ืœืจืืฉ ื”ื ื—ืฉ. 5. ื•ืžืกื™ื™ืžื™ื ื‘ืชืคื•ื— - ืื ื”ื ื—ืฉ ืื›ืœ ืขื›ืฉื™ื• ืชืคื•ื— ืžื’ืจื™ืœื™ื ืžืงื•ื ื—ื“ืฉ ืœืชืคื•ื— ื”ื‘ื, ืื ื”ื ื—ืฉ ืœื ืื›ืœ ืืช ื”ืชืคื•ื— ืžื•ืจื™ื“ื™ื ืืช ื”ื—ื•ืœื™ื” ื”ืื—ืจื•ื ื” ืžื”ื–ื ื‘. ## ืื™ืš ื›ื•ืชื‘ื™ื ื‘ื“ื™ืงื•ืช ื‘ืฉื‘ื™ืœ ืœื“ืขืช ืฉืงื•ื“ ื”ื ื—ืฉ ืขื•ื‘ื“ ืœืคื ื™ ืฉื™ืฉ ืœื ื• ืžืžืฉืง ื’ืจืคื™, ืืคืฉืจ ืœื”ืคืขื™ืœ ืื•ืชื• ืžืชื•ืš ืคื•ื ืงืฆื™ื•ืช ื‘ื“ื™ืงื”. ื‘ Rust ืื ื™ ืžื’ื“ื™ืจ ืžื•ื“ื•ืœ ื‘ื“ื™ืงื” ืžืžืฉ ื‘ืื•ืชื• ืงื•ื‘ืฅ ืขื ื”ืงื•ื“ ื”ืจื’ื™ืœ ืขื ื”ืคืงื•ื“ื•ืช:
#[cfg(test)]
mod tests {
  use super::*;
ื›ืœ ืคื•ื ืงืฆื™ื™ืช ื‘ื“ื™ืงื” ื‘ืชื•ืš ื”ืžื•ื“ื•ืœ ืฆืจื™ื›ื” ืœืงื‘ืœ ืืช ื”ืžืืคื™ื™ืŸ test, ืœื“ื•ื’ืžื”:
#[test]
fn test_can_move() {
}
ื•ื‘ืชื•ืš ืคื•ื ืงืฆื™ื™ืช ื‘ื“ื™ืงื” ืื ื™ ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ืคื•ื ืงืฆื™ื•ืช ืขื ื”ืชื—ื™ืœื™ืช assert ื›ื“ื™ ืœื‘ื“ื•ืง ืฉื“ื‘ืจื™ื ืžื›ื™ืœื™ื ืืช ื”ืขืจืš ืฉืื ื™ ืฆืจื™ืš. ืœื“ื•ื’ืžื”:
#[test]
fn test_can_move() {
  let mut game = Game::new();
  game.step(Direction::Up);
  game.step(Direction::Up);
  game.step(Direction::Up);

  assert_eq!(game.snake.front().unwrap().x, 10);
  assert_eq!(game.snake.front().unwrap().y, 7);
  assert_eq!(game.snake.len(), 1);
}
ืคื•ื ืงืฆื™ื™ืช ื”ื‘ื“ื™ืงื” ื™ื•ืฆืจืช ืžืฉื—ืง ื—ื“ืฉ, ืžื–ื™ื–ื” ืืช ื”ื ื—ืฉ ืฉืœื•ืฉื” ืฆืขื“ื™ื ืœืžืขืœื” ื•ืื– ื‘ื•ื“ืงืช ืืช ื”ืžื™ืงื•ื ืฉืœ ื”ื ื—ืฉ ื•ืืช ื”ื’ื•ื“ืœ ืฉืœื•. ืžืื—ืจ ื•ืื ื™ ื™ื•ื“ืข ืื™ืคื” ื”ื ื—ืฉ ื”ืจืืฉื•ืŸ ืžืชื—ื™ืœ ื•ืื™ืคื” ื”ืชืคื•ื— ืžืชื—ื™ืœ ืื ื™ ื‘ื˜ื•ื— ืฉื›ืœ ืคืขื ืฉืืคืขื™ืœ ืืช ื”ื‘ื“ื™ืงื” ื”ื™ื ืชืขื‘ื•ืจ. ื‘ืžืื’ืจ ื‘ื’ื™ื˜ื”ืื‘ ืชื•ื›ืœื• ืœืžืฆื•ื ืขื•ื“ ื›ืžื” ื‘ื“ื™ืงื•ืช ืฉื›ืชื‘ืชื™ ื›ื“ื™ ืœื‘ื“ื•ืง ืฉื”ื ื—ืฉ ืžืฆืœื™ื— ืœืื›ื•ืœ ืืช ื”ืชืคื•ื— ื•ืฉื”ืžืฉื—ืง ืžืกืชื™ื™ื ื›ืฉื”ื ื—ืฉ ืžืชื ื’ืฉ ื‘ืงื™ืจ. ื‘ืฉื‘ื™ืœ ืœื”ืจื™ืฅ ืืช ื”ื‘ื“ื™ืงื•ืช ืžืฉื•ืจืช ื”ืคืงื•ื“ื” ืื ื™ ื›ื•ืชื‘:
cargo test
ื”ืคืœื˜ ื›ื•ืœืœ ืื–ื”ืจื•ืช ืขืœ ืžืฉืชื ื™ื ืฉืœื ื”ืฉืชืžืฉืชื™ ื‘ื”ื ื•ืืช ื”ื˜ืงืกื˜:
running 3 tests
test game::tests::test_can_move ... ok
test game::tests::test_can_eat_apple ... ok
test game::tests::test_can_hit_a_wall ... ok

test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
ื™ืฉ ื”ืžื•ืŸ ืืคืฉืจื•ื™ื•ืช ืœื”ืคืขืœืช ื˜ืกื˜ื™ื, ืœืžืฉืœ ื‘ืฉื‘ื™ืœ ืœื”ืคืขื™ืœ ืจืง ื˜ืกื˜ื™ื ืžืงื•ื‘ืฅ ืžืกื•ื™ื ืื• ืฉื”ืฉื ืฉืœื”ื ืžืชืื™ื ืœืžื—ืจื•ื–ืช ืžืกื•ื™ืžืช. ืชื•ื›ืœื• ืœื”ืคืขื™ืœ ืžืฉื•ืจืช ื”ืคืงื•ื“ื” cargo test --help ื›ื“ื™ ืœืงื‘ืœ ืจืฉื™ืžื” ืฉืœ ื›ืœ ื”ืื•ืคืฆื™ื•ืช. ## ืชืจื’ื™ืœื™ื ืœื”ืจื—ื‘ื” ืžื—ืจ ื ื›ืชื•ื‘ GUI ืœืžืฉื—ืง ืกื ื™ื™ืง, ืื‘ืœ ื›ื‘ืจ ื‘ื™ื ืชื™ื™ื ื™ืฉ ื”ืจื‘ื” ืžื” ืœืขืฉื•ืช ืขื ื”ื ื—ืฉ ืฉื›ื‘ืจ ื‘ื ื™ื ื•. ื”ื ื” ื›ืžื” ืชืจื’ื™ืœื™ื ืฉื™ืขื–ืจื• ืœื›ื ืœื”ืชื™ื™ื“ื“ ืขื ื”ืงื•ื“ ื•ืขื ื”ืจืขื™ื•ืŸ ืฉืœ ื‘ื“ื™ืงื•ืช ื‘ืจืืกื˜: 1. ื”ื•ืกื™ืคื• ื‘ื“ื™ืงื•ืช ื›ื“ื™ ืœื•ื•ื“ื ืฉื”ืžืฉื—ืง ื™ืกืชื™ื™ื ืื ื”ื ื—ืฉ ื™ืชื ื’ืฉ ื‘ืงื™ืจื•ืช ื”ืื—ืจื™ื (ื›ืจื’ืข ื‘ืจื™ืคื• ื‘ื•ื“ืงื™ื ืจืง ืืช ื”ืงื™ืจ ื”ืขืœื™ื•ืŸ). 2. ืขื“ื›ื ื• ืืช ื”ืงื•ื“ ื›ืš ืฉื”ืžืฉื—ืง ื™ืกืชื™ื™ื ื’ื ืื ื”ื ื—ืฉ ืžืชื ื’ืฉ ื‘ืขืฆืžื•. ื”ื•ืกื™ืคื• ื‘ื“ื™ืงื•ืช ื›ื“ื™ ืœื•ื•ื“ื ืฉื”ืขื“ื›ื•ืŸ ืฉืœื›ื ืขื•ื‘ื“. 3. ื”ื•ืกื™ืคื• ืชืžื™ื›ื” ื‘"ืชืคื•ื— ื–ื”ื‘". ืชืคื•ื— ื–ื”ื‘ ื™ื›ื•ืœ ืœื”ื•ืคื™ืข ื‘ืžืงื•ื ืชืคื•ื— ืจื’ื™ืœ, ื•ืื—ืจื™ ืฉืื•ื›ืœื™ื ืื•ืชื• ื”ื ื—ืฉ ื’ื“ืœ ื‘-4 ื—ื•ืœื™ื•ืช. ืืœ ืชืฉื›ื—ื• ืœื”ื•ืกื™ืฃ ื‘ื“ื™ืงื•ืช ืžืชืื™ืžื•ืช ืœืชืคื•ื— ื”ื–ื”ื‘ ืฉืœื›ื. ืžื•ื–ืžื ื™ื ืœื”ื“ื‘ื™ืง ืคื” ืืช ื”ืคื™ืชืจื•ื ื•ืช ืฉืœื›ื ืœื”ืจื—ื‘ื•ืช ื•ืžื—ืจ ื ืžืฉื™ืš ืœื›ืชื•ื‘ GUI ืœืžืฉื—ืง ื”ื ื—ืฉ.

ToCode
1 420
# ื™ื•ื 6 - ื›ืชื™ื‘ืช ื‘ื“ื™ืงื•ืช ื™ื—ื™ื“ื” ื‘ Rust ืจืืกื˜ ืžืฆื™ืข ืชืžื™ื›ื” ืžื•ื‘ื ื™ืช ื‘ื›ืชื™ื‘ืช ื‘ื“ื™ืงื•ืช ื™ื—ื™ื“ื” ืœืžื•ื“ื•ืœื™ื. ื‘ืฉื™ืขื•ืจ ื–ื” ื ืชื—ื™ืœ ืœื‘ื ื•ืช ืžืฉื—ืง Snake ื•ื ืจืื” ืื™ืš ืœื‘ื“ื•ืง ืืช ืงื•ื“ ื”ืžืฉื—ืง ืฉืœื ื• ืœืคื ื™ ืฉืžืชื—ื™ืœื™ื ืœืฆื™ื™ืจ ืืช ื” GUI. ## ืžื” ืื ื—ื ื• ื‘ื•ื ื™ื ื”ืžื˜ืจื” ื”ื™ื ืœื‘ื ื•ืช ืžืฉื—ืง ืกื ื™ื™ืง, ืื‘ืœ ืœื ื ืกืคื™ืง ืœื‘ื ื•ืช ืื•ืชื• ื‘ื™ื•ื ืื—ื“, ื•ืœื›ืŸ ืื ื™ ืžื—ืœืง ืืช ื”ืขื‘ื•ื“ื” ืœืฉื ื™ ืคื•ืกื˜ื™ื - ื”ื™ื•ื ื ื›ืชื•ื‘ ืืช ื”ืœื•ื’ื™ืงื” ืฉืœ ื”ืžืฉื—ืง ื•ื ืฉืชืžืฉ ื‘ื‘ื“ื™ืงื•ืช ื™ื—ื™ื“ื” ื›ื“ื™ ืœืจืื•ืช ืฉืื ื—ื ื• ื‘ื›ื™ื•ื•ืŸ, ื•ืžื—ืจ ื ื—ื‘ืจ ืœื• ืžืžืฉืง ืžืฉืชืžืฉ ื’ืจืคื™ ื›ื“ื™ ืฉืืคืฉืจ ื™ื”ื™ื” ื’ื ืœืฉื—ืง. ## ืงื•ื“ ื”ืžืฉื—ืง ื‘ืฉื‘ื™ืœ ืœื‘ื ื•ืช ืžืฉื—ืง ืกื ื™ื™ืง ืื ื™ ืฆืจื™ืš ืฉื ื™ ื“ื‘ืจื™ื - ืื—ื“ ื”ื•ื ืงื•ื‘ืฅ ื”ืœื•ื’ื™ืงื” ืฉืื—ืจืื™ ืขืœ ื”ืžื™ืงื•ื ืฉืœ ื”ื ื—ืฉ, ื”ืชื ื•ืขื” ื•ื”ืชืื•ื ื•ืช ืฉืื•ืœื™ ืงื•ืจื•ืช ืœื ื—ืฉ. ื”ืฉื ื™ ื”ื•ื ื”ืžืžืฉืง ื”ื’ืจืคื™. ื‘ื ื™ื™ืช ื”ืœื•ื’ื™ืงื” ืžืจืืฉ ื•ื‘ื“ื™ืงื” ืฉืœื” ืชืขื–ื•ืจ ืœื ื• ื›ืฉื ื’ื™ืข ืœื›ืชื•ื‘ ืืช ืงื•ื“ ื” UI, ื›ื™ ืื– ื ื•ื›ืœ ืœื”ืชืžืงื“ ื‘ืžืžืฉืง ื•ืœื”ื™ื•ืช ืจื’ื•ืขื™ื ืœื’ื‘ื™ ืžื‘ื ื” ื”ืžืฉื—ืง. ืœื›ืŸ ื”ืžื˜ืจื” ืฉืœื™ ื”ื™ื•ื ื”ื™ื ืœื‘ื ื•ืช ืืช ื”ืคื•ื ืงืฆื™ื•ืช ืฉืœ ื”ืœื•ื’ื™ืงื” ืฉืœ ื”ื ื—ืฉ, ื•ืœื”ืฉืชืžืฉ ื‘ื‘ื“ื™ืงื•ืช ื™ื—ื™ื“ื” ื›ื“ื™ ืœื•ื•ื“ื ืฉื›ืœ ื”ืคื•ื ืงืฆื™ื•ืช ืฉืœื™ ืขื•ื‘ื“ื•ืช ื˜ื•ื‘. ืืจืฆื” ืœื‘ื ื•ืช: 1. ืกื˜ืจืืงื˜ ื‘ืฉื Game ืฉืžื™ื™ืฆื’ ืืช ืžืฆื‘ ื”ืžืฉื—ืง - ืื™ืคื” ื”ื ื—ืฉ, ืื™ืคื” ื”ืชืคื•ื— ื•ืžื” ื’ื•ื“ืœ ื”ืžืกืš. 2. ืคื•ื ืงืฆื™ื” ื‘ืฉื step ืฉืžืงื‘ืœืช ืืช ื”ื›ื™ื•ื•ืŸ ืฉืœ ื”ื ื—ืฉ ื•ืžื–ื™ื–ื” ืืช ื”ื ื—ืฉ ืงื“ื™ืžื”. ื”ืคื•ื ืงืฆื™ื” ืื—ืจืื™ืช ืœื‘ื“ื•ืง ืื ื”ื ื—ืฉ ืื›ืœ ืืช ื”ืชืคื•ื— ืื• ื”ื ืชื’ืฉ ื‘ืงื™ืจ ื•ื”ื™ื ืžื—ื–ื™ืจื” ืžืฉืชื ื” ื‘ื•ืœื™ืื ื™, ืขืจืš ืืžืช ืื•ืžืจ ืฉืืคืฉืจ ืœื”ืžืฉื™ืš ืœืฉื—ืง ื•ืขืจืš ืฉืงืจ ืื•ืžืจ ืฉื”ืžืฉื—ืง ื”ืกืชื™ื™ื. 3. ืคื•ื ืงืฆื™ื•ืช ื‘ื“ื™ืงื” ืœืฉืชื™ ื”ืคื•ื ืงืฆื™ื•ืช ืฉืชื™ืืจืชื™, ื›ื“ื™ ืฉืœื ื ื”ื™ื” ืžื•ืคืชืขื™ื ื›ืฉื ื—ื‘ืจ ืžืžืฉืง ื’ืจืคื™. ื ืชื—ื™ืœ ืขื ื”ื“ื‘ืจื™ื ืฉืื ื—ื ื• ื›ื‘ืจ ืžื›ื™ืจื™ื. ื‘ืฉื‘ื™ืœ ืœื›ืชื•ื‘ ืงื•ื“ ื‘ืงื•ื‘ืฅ ื ืคืจื“ ืื ื™ ืคืฉื•ื˜ ืคื•ืชื— ืืช ื”ืงื•ื‘ืฅ ื‘ืขื•ืจืš ื”ื˜ืงืกื˜. ื›ืœ ื“ื‘ืจ ืฉืืจืฆื” ืœื”ืฉืชืžืฉ ื‘ื• ืฆืจื™ืš ืœืงื‘ืœ ืืช ื”ืชื—ื™ืœื™ืช pub, ืœื›ืŸ ืžื‘ื ื” ื”ื ืชื•ื ื™ื ืฉืœ ื”ืžืฉื—ืง ื™ื”ื™ื”:
pub struct Game {
    pub size: Vec2,
    pub snake: LinkedList<XY<usize>>,
    pub apple: XY<usize>,
    pub rng: ThreadRng,
}
ื•ื‘ืฉื‘ื™ืœ ืœื“ืขืช ืžื” ื”ื›ื™ื•ื•ืŸ ื‘ื• ืžืชืงื“ืžื™ื ืื ื™ ื™ื›ื•ืœ ืœื”ื’ื“ื™ืจ enum:
pub enum Direction {
  Up,
  Down,
  Left,
  Right,
}
ื‘ืฉื‘ื™ืœ ื”ืžืกืคืจื™ื ื”ืืงืจืื™ื™ื (ืื™ืคื” ื™ื”ื™ื” ื”ืชืคื•ื—) ื”ืชืงื ืชื™ ืกืคืจื™ื” ื—ื™ืฆื•ื ื™ืช ื‘ืฉื rand. ืื ื™ ื˜ื•ืขืŸ ืื•ืชื” ื•ื’ื ืžื™ื™ื‘ื ืืช LinkedList ืœืžืจื—ื‘ ื”ืฉืžื•ืช ืฉืœื™ ืขื ื”ืคืงื•ื“ื•ืช:
use std::collections::LinkedList;
use rand::{thread_rng, Rng, rngs::ThreadRng};
ื•ืžืžืฉื™ื›ื™ื ืœืงื•ื“ ืฉืœ ื”ืžืฉื—ืง. ืื ื—ื ื• ื™ื•ื“ืขื™ื ืฉื‘ื“ืจืš ื›ืœืœ ืื—ืจื™ ืฉืžื’ื“ื™ืจื™ื Struct ืืคืฉืจ ืคืฉื•ื˜ ืœืชืช ืขืจื›ื™ื ืœื›ืœ ื”ืฉื“ื•ืช ืฉืœื• ื›ื“ื™ ืœืงื‘ืœ ืžืฉืชื ื” ืžืื•ืชื• ื”ืกื•ื’, ื›ืœื•ืžืจ ื‘ืžืงืจื” ืฉืœ Game ืืคืฉืจ ื”ื™ื” ืœื›ืชื•ื‘:
let game = Game {
    size: Vec2 { x: 20, y: 20 },
    snake: LinkedList::from([ XY::new(10, 10)]),
    apple: XY::new(5, 5),
    rng: thread_rng(),
};
ืื‘ืœ ื‘ืฉื‘ื™ืœ ืฉื™ื”ื™ื” ื ื•ื— ืœืงื•ื“ ืฉืžืฉืชืžืฉ ื‘ Struct ืื ื™ ื™ื•ืฆืจ ืคื•ื ืงืฆื™ื” ื‘ืฉื new ืฉืžื—ื–ื™ืจื” ืžืฉื—ืง ื‘ื“ื™ื•ืง ืขื ื”ืขืจื›ื™ื ื”ืืœื”. ื‘ืฆื•ืจื” ื›ื–ืืช ืงื•ื“ ื—ื™ืฆื•ื ื™ ืฉื™ืฉืชืžืฉ ื‘ืžืฉื—ืง ื™ื•ื›ืœ ืœื›ืชื•ื‘ ืจืง:
let mut game = Game::new();
ื”ืคื•ื ืงืฆื™ื” ืื’ื‘ ื ืจืื™ืช ื›ืš:
pub fn new() -> Self {
    let game = Game {
        size: Vec2 { x: 20, y: 20 },
        snake: LinkedList::from([ XY::new(10, 10)]),
        apple: XY::new(5, 5),
        rng: thread_rng(),
    };

    return game;
}
ื•ื”ื™ื ืžื•ื’ื“ืจืช ื‘ืชื•ืš ื‘ืœื•ืง impl ืฉืœ ื”ืžืฉื—ืง:
impl Game {
    // all "Game" functions go here
    // pub fn new() -> Self { ... }
}
ื”ืคื•ื ืงืฆื™ื” ื”ืฉื ื™ื” ื•ื”ื™ื•ืชืจ ืžืขื ื™ื™ื ืช ืฉืžื•ื’ื“ืจืช ืขืœ Game ื”ื™ื step, ื•ื”ื™ื ื–ืืช ืฉืžื–ื™ื–ื” ืืช ื”ืžืฉื—ืง ืฆืขื“ ืื—ื“ ืงื“ื™ืžื”. ื›ื›ืœ ืฉื ืคืขื™ืœ ืื•ืชื” ืœืขืชื™ื ื™ื•ืชืจ ืงืจื•ื‘ื•ืช ื›ืš ื”ืžืฉื—ืง ื™ื”ื™ื” ื™ื•ืชืจ ืงืฉื”. ื”ื ื” ื”ืงื•ื“:
    pub fn step(&mut self, dir: Direction) -> bool {
      let head = self.snake.front().unwrap();

      let next_head = match dir {
        Direction::Up => XY::new(head.x, head.y - 1),
        Direction::Down => XY::new(head.x, head.y + 1),
        Direction::Left => XY::new(head.x - 1, head.y),
        Direction::Right => XY::new(head.x + 1, head.y),
      };

      if (next_head.x >= self.size.x) || (next_head.x == 0) || (next_head.y >= self.size.y) || (next_head.y == 0) {
        return false;
      }

      self.snake.push_front(next_head);

      if (next_head.x != self.apple.x) || (next_head.y != self.apple.y) {
        self.snake.pop_back();
      } else {
        // ate an apple
        self.apple.x = self.rng.gen_range(0..self.size.x);
        self.apple.y = self.rng.gen_range(0..self.size.y);
      }
      
      return true;
    }

ToCode
1 420
4. ื”ืคืงื•ื“ื” io::copy ืฉืœ ืจืืกื˜ ืžืงื‘ืœืช Reader ื• Writer, ื•ืžืขืชื™ืงื” ืืช ื›ืœ ื”ืชื•ื›ืŸ ืฉืœ ื” Reader ืœ Writer. ืืคืฉืจ ืœืงืจื•ื ืขืœื™ื” ื‘ืชื™ืขื•ื“ ื›ืืŸ https://doc.rust-lang.org/std/io/fn.copy.html. ื”ื—ืœื™ืคื• ืืช ืงื•ื“ ื”ืงืจื™ืื” ื•ื”ื›ืชื™ื‘ื” ื‘ืงืจื™ืื” ืœ copy, ื›ื“ื™ ืฉื”ืžืขืจื›ืช ืชืขื‘ื•ื“ ื’ื ืขืœ ืงืœื˜ ืฉืœื ืžื›ื™ืœ ืชื•ื•ื™ ื™ืจื™ื“ื•ืช ืฉื•ืจื”. ืžื•ื–ืžื ื™ื ืœื”ื“ื‘ื™ืง ืืช ื”ืคื™ืชืจื•ื ื•ืช ืื• ืฉืืœื•ืช ืื ื™ืฉ ืœื›ื ื›ืืŸ ื‘ืชื’ื•ื‘ื•ืช, ื•ืื ื—ื ื• ื ืžืฉื™ืš ืžื—ืจ ืœื›ืชื•ื‘ ืžืฉื—ืง ืงืฆืจ ื‘ Rust.

ToCode
1 420
# ื™ื•ื 5 - ืžื™ืžื•ืฉ ืฉืจืช Echo ื‘ Rust ืื—ืจื™ ื›ืœ ื”ื“ื‘ืจื™ื ื”ื™ืคื™ื ืฉืžืฆืืชื™ ื‘ Rust, ื”ื™ื•ื ื’ื™ืœื™ืชื™ ืืช ืฉื ื™ ื”ื“ื‘ืจื™ื ืฉืขื“ื™ื™ืŸ ื—ืกืจื™ื - ืชืžื™ื›ื” ืžื•ื‘ื ื™ืช ื‘ืžื•ื“ืœ ืชื›ื ื•ืช ืืกื™ื ื›ืจื•ื ื™ ื•ืชืžื™ื›ื” ื‘ Green Threads. ื‘ื•ืื• ื ืจืื” ืืช ืฉืชื™ ื”ื‘ืขื™ื•ืช ื“ืจืš ื‘ื ื™ื™ืช ืฉืจืช Echo. ## ืžื” ืื ื—ื ื• ื‘ื•ื ื™ื ื ืจืฆื” ืœื‘ื ื•ืช ืฉืจืช ืฉืžืื–ื™ืŸ ืœื‘ืงืฉื•ืช, ื›ืœ ืคืขื ืฉืžืฉืชืžืฉ ืžืชื—ื‘ืจ (ืคืฉื•ื˜ ื‘ืืžืฆืขื•ืช TCP Socket) ื”ืฉืจืช ื™ืงืจื ืฉื•ืจื” ืžื”ืžืฉืชืžืฉ, ื™ื›ืชื•ื‘ ืื•ืชื” ื‘ื—ื–ืจื” ืœืื•ืชื• Socket ื•ืื– ื™ืžืชื™ืŸ ืœืฉื•ืจื” ื”ื‘ืื”. ื‘ืฉื‘ื™ืœ ืœื“ื‘ืจ ืขื ื›ืžื” ืœืงื•ื—ื•ืช ื‘ืžืงื‘ื™ืœ ื”ืฉืจืช ื™ืฉืชืžืฉ ื‘ Threads, ื•ื ืคืชื— Thread ืœื›ืœ ืœืงื•ื— ื—ื“ืฉ ืฉืžืชื—ื‘ืจ. ## ืงื•ื“ ื”ืชื•ื›ื ื™ืช ื”ืงื•ื“ ืœื ืืจื•ืš ื•ื™ืœืžื“ ืื•ืชื ื• ืื™ืš ืœืขื‘ื•ื“ ื‘ืจืฉืช ื•ื‘ืฆื•ืจื” ืžืงื‘ื™ืœื™ืช ื‘ Rust. ืงื•ื“ื ื”ื“ื‘ืงื” ืื—ืจื™ ื–ื” ื”ืกื‘ืจื™ื:
use std::io::{Write, BufReader, BufRead, BufWriter};
use std::net::TcpListener;
use std::thread;

fn main() {
    let listener = TcpListener::bind("127.0.0.1:9123").unwrap();
    println!("listening started, ready to accept");
    for stream in listener.incoming() {
        thread::spawn(|| {            
            let stream = match stream {
                Ok(s) => s,
                Err(_) => return,
            };

            let mut reader = BufReader::new(&stream);
            let mut writer = BufWriter::new(&stream);

            loop {
                let mut line = String::new();
                match reader.read_line(&mut line) {
                    Ok(0) => return,
                    Ok(l) => l,
                    Err(_) => return,
                };
    
                let output = format!("You Said: {}", &line);                
                if let Err(_) = writer.write(output.as_bytes()) {
                    return;
                }
                if let Err(_) = writer.flush() {
                    return;
                }
            }
        });
    }
}
## ืฉื™ืžื• ืœื‘ ืœืฉื ื™ ื”ืงื•ื•ื™ื ื”ืื ื›ื™ื™ื ื”ืคืงื•ื“ื” bind ืžืชื—ื™ืœื” ืœื”ืื–ื™ืŸ ืœ Port ื•ืืคื™ืœื• ื‘ืœื™ ืœืงืจื•ื ืขืœื™ื” ืื ื—ื ื• ื™ื•ื“ืขื™ื ืฉื”ื™ื ืžื—ื–ื™ืจื” Result, ื‘ื’ืœืœ ืฉื”ืงื•ื“ ืžืคืขื™ืœ unwrap ืขืœื™ื• ื›ื“ื™ ืœืงื‘ืœ ืืช ืžื” ืฉื‘ืคื ื™ื. ืื ืœื ื”ืฆืœื—ื ื• ืœืชืคื•ืก ืืช ื”ืคื•ืจื˜ ื–ื” ื‘ืกื“ืจ ืœืกื™ื™ื ืืช ื”ืชื•ื›ื ื™ืช ื•ืœื ืœื”ืคืขื™ืœ ืืช ื”ืฉืจืช. ื’ื ืœื•ืœืืช ื” for ื‘ืฉื•ืจื” ื”ื‘ืื” ืœื ืฆืจื™ื›ื” ืœื”ืคืชื™ืข. ืื‘ืœ ืžื” ืฉืงื•ืจื” ื‘ืชื•ืš ื”ืœื•ืœืื” ื–ื” ืกื™ืคื•ืจ ืื—ืจ:
thread::spawn(|| {
ื”ืคืงื•ื“ื” thread::spawn ืžืชื—ื™ืœื” Thread ื—ื“ืฉ. ื”ื™ื ืžืงื‘ืœืช ืคืจืžื˜ืจ ืžืกื•ื’ ืฉืขื“ื™ื™ืŸ ืœื ื ืชืงืœื ื• ื‘ื• ื•ื ืงืจื Closure. ืงืœื•ื–'ืจ ื”ื•ื ื‘ืขืฆื ืคื•ื ืงืฆื™ื” ืฉื™ื›ื•ืœื” "ืœืชืคื•ืก" ืืช ื”ืกื‘ื™ื‘ื” ืฉืœื”, ื•ืœื’ืฉืช ืœืžืฉืชื ื™ื ืฉื”ื•ื’ื“ืจื• ืžืขืœื™ื”. ื–ื” ืžื‘ื ื” ืฉืื ื—ื ื• ืžื›ื™ืจื™ื ืžืฉืคื•ืช ื“ื™ื ืžื™ื•ืช ืจื‘ื•ืช ื•ื‘ืžื™ื•ื—ื“ JavaScript ื• Python. ื”ืงืœื•ื–'ืจ ืฉืœ thread::spawn ืžืงื‘ืœืช ื–ื” ื”ืงื•ื“ ืฉื” Thread ื™ืจื™ืฅ, ื›ืœื•ืžืจ ื”ืงื•ื“ ืฉื™ืจื•ืฅ ื‘ืžืงื‘ื™ืœ ืœืชื•ื›ื ื™ืช ื”ื ื•ื›ื—ื™ืช. ืืคืฉืจ ืœื”ื’ื™ื“ ืฉื›ืœ ืื™ื˜ืจืฆื™ื” ืฉืœ ื”ืœื•ืœืื” ืžืชื—ื™ืœื” ืคืขื•ืœื” ื‘ืจืงืข, ื•ืœื›ืŸ ื”ืœื•ืœืื” ืžืกืชื™ื™ืžืช ืžืžืฉ ืžื”ืจ. ื”ืคืขื•ืœื•ืช ื‘ืจืงืข ื™ื›ื•ืœื•ืช ืœื”ื™ื•ืช ืื™ื˜ื™ื•ืช ืื‘ืœ ื”ืŸ ืœื ืžืคืจื™ืขื•ืช ืœื”ืชืงื“ืžื•ืช ื”ืจื’ื™ืœื” ืฉืœ ื”ืฉืจืช, ืฉืžื”ืจ ืžืื•ื“ ื™ื—ื–ื•ืจ ืœื—ืคืฉ ืขื•ื“ ื—ื™ื‘ื•ืจื™ื ื—ื“ืฉื™ื. ื” Thread ืฉ thread::spawn ืžื™ื™ืฆืจืช ื”ื•ื ืชื”ืœื™ื›ื•ืŸ ืฉืœ ืžืขืจื›ืช ื”ื”ืคืขืœื” ื•ืœื Green Thread. ืžืฆื“ ืื—ื“ ื–ื” ืื•ืžืจ ืฉื”ืงื•ื“ ืฉืœื ื• ืงืจื•ื‘ ื™ื•ืชืจ ืœื‘ืจื–ืœื™ื, ืื‘ืœ ืžืฆื“ ืฉื ื™ ืื ื—ื ื• ืžืคืกื™ื“ื™ื ื‘ื™ืฆื•ืขื™ื ื˜ื•ื‘ื™ื ื™ื•ืชืจ ืฉื”ื™ื™ื ื• ื™ื›ื•ืœื™ื ืœืงื‘ืœ ืžืกืคืจื™ื™ืช ื” Thread-ื™ื ืฉืœ ืจืืกื˜. ืžื” ืฉื™ื•ืชืจ ืฆื•ืจื ื‘ืงื•ื“ ื”ื–ื” ื”ื•ื ื”ื‘ื—ื™ืจื” ืœืขื‘ื•ื“ ื‘ Thread-ื™ื ื‘ืžืงื•ื ื‘ืžื•ื“ืœ ืคื™ืชื•ื— ืืกื™ื ื›ืจื•ื ื™, ืฉืขื“ื™ื™ืŸ ืœื ืžื•ื‘ื ื” ื‘ืฉืคืช Rust. ื™ืฉ ืกืคืจื™ื™ืช ืขื–ืจ ื‘ืฉื tokio ืฉื›ืŸ ืžืืคืฉืจืช ืืช ื”ืžื•ื“ืœ ื”ืืกื™ื ื›ืจื•ื ื™, ื•ืื ื—ื ื• ืขื•ื“ ื ื—ื–ื•ืจ ืœื“ื‘ืจ ืขืœื™ื”. ืžื‘ื—ื™ื ืช ื”ืงื•ื“ ืฉืจืฅ ื‘ืชื•ืš ื” Thread, ืฉื ืœื ืจืฆื™ืชื™ ืœืจืกืง ืืช ื”ืชื”ืœื™ื›ื•ืŸ ื‘ืฉื•ื ืžืฆื‘ ื•ืœื›ืŸ ื”ืงืคื“ืชื™ ืœื”ืฉืชืžืฉ ื‘ match ื›ื“ื™ ืœื–ื”ื•ืช ืฉื’ื™ืื•ืช ื•ืœื ื‘ unwrap. ืžื‘ื ื” ื›ื–ื” ื™ื›ื•ืœ ืœืขื–ื•ืจ ืื ื—ืฉื•ื‘ ืœื ื• ืœืกื’ื•ืจ ืืช ื”ื—ื™ื‘ื•ืจ ื‘ืฆื•ืจื” ืžืกื•ื“ืจืช ื•ืœื ืœื”ืจืื•ืช ืฉื’ื™ืื•ืช ื‘ืœื•ื’ ืฉืœ ื”ืฉืจืช, ืื‘ืœ ืžืžืฉื—ืงื™ื ืฉืขืฉื™ืชื™ ื’ื unwrap ืขื•ื‘ื“ ื“ื™ ื˜ื•ื‘ ื•ื”ืฉืจืช ืฉื•ืจื“ ื‘ืขื™ื•ืช ืชืงืฉื•ืจืช ืืฆืœ ืœืงื•ื— ืื—ื“ ื‘ืœื™ ืœืคื’ื•ืข ื‘ืฉืืจ ื”ืœืงื•ื—ื•ืช. ## ืชืจื’ื™ืœื™ื ืœื”ืจื—ื‘ื” ื—ื•ืฉื‘ื™ื ืฉื”ื‘ื ืชื ืื™ืš ืฉืจืช ืจืืกื˜ ืขื•ื‘ื“? ื‘ื•ืื• ื ืœืš ืœื‘ืขื•ื˜ ื‘ื• ืงืฆืช: 1. ื”ืคืขื™ืœื• ืืช ื”ืฉืจืช ืฉื™ืื–ื™ืŸ ืœืคื•ืจื˜ 9123. ื”ืฉืชืžืฉื• ื‘ telnet ืื• nc ื›ื“ื™ ืœื”ืชื—ื‘ืจ ืืœื™ื• ืžื—ืœื•ืŸ ืื—ืจ ื•ืชืจืื• ืฉืืชื ืžืฆืœื™ื—ื™ื ืœืฉืœื•ื— ื”ื•ื“ืขื” ื•ืœืงื‘ืœ ืื•ืชื” ื—ื–ืจื”. 2. ื”ื•ืกื™ืคื• ืžื ื’ื ื•ืŸ ืฉืกื•ืคืจ ื›ืžื” ืœืงื•ื—ื•ืช ืคืขื™ืœื™ื ื™ืฉ. ื›ืœ ืคืขื ืฉืœืงื•ื— ืžืชื—ื‘ืจ ื™ืฉ ืœื”ื“ืคื™ืก ื‘ืžืกืš ืฉืœ ื”ืฉืจืช ื”ื•ื“ืขื” ืฉืœืงื•ื— ื—ื“ืฉ ื”ืชื—ื‘ืจ ื•ื›ืžื” ืœืงื•ื—ื•ืช ื›ืจื’ืข ื™ืฉ. ื›ืœ ืคืขื ืฉืœืงื•ื— ืžืชื ืชืง ื™ืฉ ืœื”ื“ืคื™ืก ื”ื•ื“ืขื” ื“ื•ืžื” ื‘ืžืกืš ืฉืœ ื”ืฉืจืช. 3. ื”ืคื›ื• ืืช ืฉืจืช ื” Echo ืœืฉืจืช Chat - ืฉืžืจื• ื•ืงื˜ื•ืจ ืฉืœ ื›ืœ ื”ืœืงื•ื—ื•ืช ืฉื›ืจื’ืข ืžื—ื•ื‘ืจื™ื, ื•ื›ืœ ืคืขื ืฉืžื™ืฉื”ื• ืฉื•ืœื— ื”ื•ื“ืขื” ืฉืœื—ื• ืืช ื”ื”ื•ื“ืขื” ื”ื–ืืช ืœื›ืœ ื”ืœืงื•ื—ื•ืช ื”ืื—ืจื™ื.

ToCode
1 420
ืืช ื”ืคืงื•ื“ื” unwrap ืื ื—ื ื• ื›ื‘ืจ ืžื›ื™ืจื™ื - ื”ื™ื ืžื—ื–ื™ืจื” ืืช ื”ืชื•ื›ืŸ ืฉืœ ื”ืื•ืคืฆื™ื” Ok ืž Result, ืื• ืžืจืกืงืช ืืช ื”ืชื•ื›ื ื™ืช ืขื ืฉื’ื™ืื” ืื ืื•ืชื• Result ืžื™ื™ืฆื’ ืฉื’ื™ืื”. ื”ืคืงื•ื“ื” unwrap_or ื”ื™ื ื’ื™ืจืกื” ืคื—ื•ืช ืืœื™ืžื” ืฉืœ ืื•ืชื” unwrap. ืื ื”ื™ื ืžื•ืคืขืœืช ืขืœ Result ืขื ืฉื’ื™ืื”, ื”ื™ื ืžืงื‘ืœืช ืขืจืš (ืขื‘ื•ืจ ื” Or), ื•ืื ื™ืฉ ื‘ Result ืฉื’ื™ืื” ื”ื™ื ืชื—ื–ื™ืจ ืืช ืื•ืชื• ืขืจืš. ื”ืคืงื•ื“ื” expect ืฉืœ Option ืžื—ื–ื™ืจื” ืืช ื”ืขืจืš ืื ืงื™ื™ื, ืื• ืžืจืกืงืช ืืช ื”ืชื•ื›ื ื™ืช ืื ื™ืฉ ืฉื’ื™ืื”. ืกืš ื”ื›ืœ ื‘ืžืฉืชื ื” lines ื ืงื‘ืœ ืืช ื”ืขืจืš ืฉืœ ื”ืฉื“ื” lines ืž cli, ืื‘ืœ ืื ืœื ื”ื•ื’ื“ืจ ืื—ื“ ื ืงื‘ืœ 10. ื–ื™ื›ืจื• ืฉื”ืฉื“ื” lines ื”ื™ื” ืžื•ื’ื“ืจ ื‘ืกื˜ืจืืงื˜ ื›ืš:
#[arg(short='n')]
lines: Option<String>,
ืžืืคื™ื™ืŸ ืื•ืคืฆื™ื•ื ืืœื™ ืžืกื•ื’ String ื•ื”ืื•ืช ืฉืžืชืื™ืžื” ืœืื•ืคืฆื™ื” ื”ื™ื n. ื”ืžืืคื™ื™ื ื™ื reverse ื• name ืœื ืฆืจื™ื›ื™ื ื˜ื™ืคื•ืœ ืžื™ื•ื—ื“, ื•ืื—ืจื™ ื”ืคื™ืขื ื•ื— ืืคืฉืจ ืœื”ืขื‘ื™ืจ ืืช ื›ื•ืœื ืœืคื•ื ืงืฆื™ื” tail_file. ื–ื” ื”ืžื™ืžื•ืฉ ืฉืœื”:
fn tail_file(filename: Option<&str>, lines_count: usize, reverse: bool) {    
    let mut last_lines: Vec<String> = Vec::with_capacity(lines_count);

    let reader: Box<dyn BufRead> = match filename {
        None => Box::new(BufReader::new(stdin())),
        Some(filename) => Box::new(BufReader::new(fs::File::open(filename).unwrap()))
    };

    let mut idx = 0;
    for line in reader.lines() {        
        if idx < last_lines.len() {
            last_lines[idx] = line.unwrap();
        } else {
            last_lines.push(line.unwrap());
        }
        idx = (idx + 1) % lines_count;
    }

    for i in 0..lines_count {
        if reverse {
            let j = lines_count - (i + 1);
            println!("[{}] {}", j, last_lines[(idx + j) % lines_count]);
        } else {
            println!("[{}] {}", i, last_lines[(idx + i) % lines_count]);
        }
        
    }
}
ืงืฆืช ืืจื•ื›ื” ืื‘ืœ ืื™ืŸ ื”ืจื‘ื” ื—ื“ืฉ. ื”ืงื•ื“ ืžื’ื“ื™ืจ ืžืฉืชื ื” ืžืกื•ื’ Vec<String> ืฉื–ื” ื•ืงื˜ื•ืจ ืฉืœ ืžื—ืจื•ื–ื•ืช. ื•ืงื˜ื•ืจ ื–ื” ื™ืฉืžื•ืจ ืืช ื”ืฉื•ืจื•ืช ื”ืื—ืจื•ื ื•ืช ื‘ืงื•ื‘ืฅ, ืื•ืชืŸ ื ืจืฆื” ืœื”ื“ืคื™ืก ื›ืฉื”ืงืœื˜ ื™ื™ื’ืžืจ. ืื ื™ ื™ื•ืฆืจ BufReader ืžื”ืงื•ื‘ืฅ ื‘ื“ื™ื•ืง ื›ืžื• ืฉืขืฉื™ืชื™ ืืชืžื•ืœ ืขื wc, ื•ืื– ืจืฅ ืขืœ ื”ืงื•ื‘ืฅ ื•ืฉื•ืžืจ ืืช ื”ืฉื•ืจื•ืช ืœื•ืงื˜ื•ืจ. ื‘ืขื–ืจืช ืื•ืคืจื˜ื•ืจ ื”ืฉืืจื™ืช ืื ื™ ื™ื›ื•ืœ ืœืžืœื ืืช ื”ื•ืงื˜ื•ืจ ื•ื›ืฉื”ื•ื ื™ื™ื’ืžืจ ืื•ื˜ื•ืžื˜ื™ืช ื”ืฉื•ืจื” ื”ื‘ืื” ืชื™ื›ืชื‘ ืœื”ืชื—ืœื”, ื•ื›ืš ื‘ืกื•ืฃ ื”ืงืœื˜ ื”ื•ืงื˜ื•ืจ ื™ื›ื™ืœ ืืช ื” n ืฉื•ืจื•ืช ื”ืื—ืจื•ื ื•ืช. ื”ื—ืœืง ื”ืื—ืจื•ืŸ ืฉืœ ื”ืคื•ื ืงืฆื™ื” ืจืฅ ื‘ืœื•ืœืื” ืขืœ ื”ื•ืงื˜ื•ืจ ื•ืžื“ืคื™ืก ืืช ื”ืฉื•ืจื•ืช, ืœืคืขืžื™ื ื‘ืกื“ืจ ื”ื ื›ื•ืŸ ื•ืœืคืขืžื™ื ื‘ืกื“ืจ ื”ืคื•ืš, ืœืคื ื™ ืขืจืš ื”ืžืฉืชื ื” reverse. ## ืชืจื’ื™ืœื™ื ืœื”ืจื—ื‘ื” ืืคืฉืจ ืœืงืจื•ื ื“ื™ ื”ืจื‘ื” ืขืœ clap ื‘ื“ืฃ ื”ืชื™ืขื•ื“ ืฉืœื” ื‘ืงื™ืฉื•ืจ: https://docs.rs/clap/latest/clap/. ื”ืชื—ื™ืœื• ืฉื ื•ื ืกื• ืœืขื“ื›ืŸ ืืช ื”ืงื•ื“ ืœืคื™ ื”ืกืขื™ืคื™ื ื”ื‘ืื™ื: 1. ื”ื•ืกื™ืคื• ื”ืกื‘ืจ ืงืฆืจ ืขืœ ื”ืชื•ื›ื ื™ืช ืฉื™ื•ืคื™ืข ื›ืฉืžืคืขื™ืœื™ื ืืช ืžืกืš ื”ืขื–ืจื”. 2. ื”ื•ืกื™ืคื• ืืคืฉืจื•ืช ืœืงื‘ืœ ืืช ืžืกืคืจ ื”ืฉื•ืจื•ืช ื’ื ื‘ืืžืฆืขื•ืช ื”ืื•ืคืฆื™ื” ื”ืืจื•ื›ื” --lines, ื›ืœื•ืžืจ ืฉืืคืฉืจ ื™ื”ื™ื” ืœื”ืคืขื™ืœ ืืช ื”ืชื•ื›ื ื™ืช ืขื tail --lines 15. 3. ื”ื•ืกื™ืคื• ืชืžื™ื›ื” ื‘ tail ืขืœ ืžืกืคืจ ืงื‘ืฆื™ื. ืื ื”ืชื•ื›ื ื™ืช ืงื™ื‘ืœื” ืžืกืคืจ ืฉืžื•ืช ืฉืœ ืงื‘ืฆื™ื ื‘ืฉื•ืจืช ื”ืคืงื•ื“ื” ื™ืฉ ืœื”ืคืขื™ืœ tail ืขืœ ื›ืœ ืื—ื“ ืžื”ื. 4. ืคืงื•ื“ืช tail ื”ืืžื™ืชื™ืช ืชื•ืžื›ืช ื‘ืืคืฉืจื•ืช ืฉื ืงืจืืช Follow, ื‘ื” ืžืฆื™ื’ื™ื ืืช ื”ืฉื•ืจื•ืช ื”ืื—ืจื•ื ื•ืช ื•ืื– ืžื—ื›ื™ื ืฉื™ื™ื›ืชื‘ ืžื™ื“ืข ื ื•ืกืฃ ืœืงื•ื‘ืฅ ื•ืื– ืžืžืฉื™ื›ื™ื ืœื”ืฆื™ื’ ื’ื ืื•ืชื•. ืงืจืื• ืขืœ ื”ืกืคืจื™ื” notify ืฉืœ ืจืืกื˜ ื•ื”ื•ืกื™ืคื• ืชืžื™ื›ื” ื‘ Follow ืœืคืงื•ื“ืช ื” tail ืฉืœื ื•. ืขื“ ืœื›ืืŸ ื˜ื™ืคื•ืœ ื‘ืงืœื˜ ืžืฉื•ืจืช ื”ืคืงื•ื“ื” ื‘ Rust. ืžื—ืจ ื ื™ืงื— ื”ืคืกืงื” ืžืชื•ื›ื ื™ื•ืช ืฉื•ืจืช ืคืงื•ื“ื” ื•ื ืœืš ืœืจืื•ืช ืื™ืš Rust ืžืชืžื•ื“ื“ ืขื ื‘ื™ืฆื•ืข ืžืฉื™ืžื•ืช ื‘ืžืงื‘ื™ืœ ื•ืขื‘ื•ื“ื” ื‘ืจืฉืช. ื›ืžื• ืชืžื™ื“ ืื ืคืชืจืชื ื—ืœืง ืžืชืจื’ื™ืœื™ ื”ื”ืจื—ื‘ื” ืžื•ื–ืžื ื™ื ืœื”ื“ื‘ื™ืง ืืช ื”ืงื•ื“ ื›ืืŸ ื‘ืชื’ื•ื‘ื•ืช.

ToCode
1 420
# ื™ื•ื 4 - ืžื™ืžื•ืฉ tail ื‘ Rust ืื ื™ืฉ ืžืฉื”ื• ืฉืœืžื“ืชื™ ืžื”ืชืจื’ื™ืœ ืฉืœ ืืชืžื•ืœ ื–ื” ื”ื—ืฉื™ื‘ื•ืช (ื•ื”ืงื•ืฉื™) ื‘ืคื™ืขื ื•ื— ืืจื’ื•ืžื ื˜ื™ื ืฉื”ื’ื™ืขื• ืžืฉื•ืจืช ื”ืคืงื•ื“ื”. ื”ื™ื•ื ื ื“ื‘ืจ ืขืœ ื”ืกืคืจื™ื” clap ืฉื”ื•ืคื›ืช ืืช ื”ื›ืชื™ื‘ื” ืฉืœ ื™ื™ืฉื•ืžื™ ืฉื•ืจืช ืคืงื•ื“ื” ืœืžืฉื™ืžื” ื”ืจื‘ื” ื™ื•ืชืจ ื ืขื™ืžื”. ## ืžื” ืื ื—ื ื• ื‘ื•ื ื™ื ืื—ืจื™ ืฉื›ืชื‘ื ื• ืืช wc ื ื•ื›ืœ ืœื”ืžืฉื™ืš ืœื›ืœื™ ื™ื•ื ื™ืงืก ืžืคื•ืจืกื ื ื•ืกืฃ - ื–ื”ื• tail. ื”ืคืงื•ื“ื” tail ืงืฆืช ื™ื•ืชืจ ืžืืชื’ืจืช ืž wc, ื›ื™ ื‘ืฉื‘ื™ืœื” ื ืฆื˜ืจืš ืœืœืžื•ื“ ืื™ืš ืœืฉืžื•ืจ ืžืกืคืจ ืฉื•ืจื•ืช ื™ื—ื“ ื‘ื•ืงื˜ื•ืจ, ื•ื‘ื ื•ืกืฃ ื ืจืฆื” ืœื”ืชืงื™ืŸ ืกืคืจื™ื” ื—ื™ืฆื•ื ื™ืช ื‘ืฉื clap ืฉืชืขื–ื•ืจ ืœื ื• ื‘ืคื™ืขื ื•ื— ืืจื’ื•ืžื ื˜ื™ื ืฉืงื™ื‘ืœื ื• ืžืฉื•ืจืช ื”ืคืงื•ื“ื”. ื›ืžื• ืชืžื™ื“ ื”ืงื•ื“ ืœืคื•ืกื˜ ื ืžืฆื ื‘ื’ื™ื˜ื”ืื‘ ื‘ืงื™ืฉื•ืจ https://github.com/ynonp/rust-8-days/tree/main/day4%20-%20tail/tail. ื‘ื•ืื• ื ืจืื” ืืช ืขื™ืงืจื™ ื”ื“ื‘ืจื™ื ื•ืื– ื ื“ื‘ืจ ืขืœื™ื”ื. ## ืงื•ื“ ื”ืชื•ื›ื ื™ืช ืื ื™ ืžืชื—ื™ืœ ืืช ืกืงื™ืจืช ื”ืงื•ื“ ืžื”ืงื•ื‘ืฅ Cargo.toml, ืงื•ื‘ืฅ ืฉื”ื•ืคื™ืข ื‘ื›ืœ ื”ืคืจื•ื™ืงื˜ื™ื ืฉื›ืชื‘ื ื• ืขื“ ืขื›ืฉื™ื• ืื‘ืœ ืœื ื–ื›ื” ืœืชืฉื•ืžืช ืœื‘. ืงื•ื‘ืฅ ื–ื” ืžื’ื“ื™ืจ ืืช ืžื‘ื ื” ื”ืคืจื•ื™ืงื˜ ื•ื‘ื™ืŸ ื”ืฉืืจ ืžื’ื“ื™ืจ ืืช ื”ืชืœื•ื™ื•ืช - ืกืคืจื™ื•ืช ื—ื™ืฆื•ื ื™ื•ืช ืžืžืื’ืจ ื—ื‘ื™ืœื•ืช ืจืฉืžื™ ืฉืœ rust ืฉื”ืคืจื•ื™ืงื˜ ืฉืœื ื• ืฆืจื™ืš. ื”ื›ืœื™ Cargo ื‘ืื•ืคืŸ ืื•ื˜ื•ืžื˜ื™ ืงื•ืจื ืืช ื”ืงื•ื‘ืฅ ื•ืžืชืงื™ืŸ ืืช ื”ืชืœื•ื™ื•ืช ื›ืฉืื ื—ื ื• ืžืคืขื™ืœื™ื cargo run. ื”ืงื•ื‘ืฅ ืžื›ื™ืœ ืืช ื”ืชื•ื›ืŸ ื”ื‘ื:
[package]
name = "tail"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
clap = { version = "4.0.19", features = ["derive"] }
ื”ืคื•ืจืžื˜ ื ืงืจื toml ื•ื”ื•ื ืžื”ื•ื•ื” ืืœื˜ืจื ื˜ื™ื‘ื” ื ื•ื—ื” ืœ yml ืขื‘ื•ืจ ืงื‘ืฆื™ ืงื•ื ืคื™ื’ื•ืจืฆื™ื”. ื”ืงื•ื‘ืฅ ืžื—ื•ืœืง ืœื‘ืœื•ืงื™ื ื›ืืฉืจ ื›ืœ ื‘ืœื•ืง ืžืงื‘ืœ ื›ื•ืชืจืช ื‘ืชื•ืš ืกื•ื’ืจื™ื™ื ืžืจื•ื‘ืขื™ื, ื‘ืžืงืจื” ืฉืœื ื• ื”ื‘ืœื•ืงื™ื ื”ื package ื• dependencies. ื”ื‘ืœื•ืง package ืžืกืคืจ ืขืœ ื”ืคืจื•ื™ืงื˜, ื•ื”ื‘ืœื•ืง dependencies ืžื›ื™ืœ ืจืฉื™ืžื” ืฉืœ ื”ืกืคืจื™ื•ืช ื”ื—ื™ืฆื•ื ื™ื•ืช ื‘ื”ืŸ ื”ืคืจื•ื™ืงื˜ ืžืฉืชืžืฉ. ื—ื‘ื™ืœื” ื—ื™ืฆื•ื ื™ืช ื‘ืจืืกื˜ ื ืงืจืืช Crate ื•ื›ื•ืœืŸ ืžืื•ื—ืกื ื•ืช ื‘ืžืื’ืจ https://crates.io/. ืืช ื”ื“ืฃ ืฉืœ clap ื ื•ื›ืœ ืœืžืฆื•ื ื‘ืงื™ืฉื•ืจ https://crates.io/crates/clap. ื‘ื—ื–ืจื” ืœ main.rs ืฉืžืชื—ื™ืœ ืขื ื”ื‘ืœื•ืง:
#[derive(Parser)]
#[command(author, version, about, long_about = None)]
struct Cli {
    name: Option<String>,

    #[arg(short)]
    reverse: bool,

    #[arg(short='n')]
    lines: Option<String>,
}
ืื ื—ื ื• ื›ื‘ืจ ื™ื•ื“ืขื™ื ืœื”ื’ื“ื™ืจ struct, ืื‘ืœ ืžื” ื–ื” ื”ืชื—ื‘ื™ืจ ืฉืžืขืœ ื” Struct? ื‘ Rust ืืคืฉืจ ืœื”ื•ืกื™ืฃ ืœืžื‘ื ื™ื ืžืกื•ื™ืžื™ื Metadata ื‘ืขื–ืจืช ืกื™ืžืŸ ื”ืกื•ืœืžื™ืช. ื–ื” ื ืงืจื ื‘ืจืืกื˜ื™ืช Attributes ื•ืืคืฉืจ ืœืงืจื•ื ืขืœื™ื”ื ื‘ืงื™ืฉื•ืจ https://doc.rust-lang.org/rust-by-example/attribute.html. ื”ืžืืคื™ื™ืŸ derive ืœืžืฉืœ ืžื’ื“ื™ืจ ืžื™ืžื•ืฉ ื‘ืกื™ืกื™ ืœ Trait ืื•ืชื• ื”ืงื•ืžืคื™ื™ืœืจ ื™ืฉืชื•ืœ ื‘ืฆื•ืจื” ืื•ื˜ื•ืžื˜ื™ืช. ื”ืžืืคื™ื™ืŸ command ื™ื™ืงืจื ืขืœ ื™ื“ื™ ื”ืกืคืจื™ื” clap ื•ื™ื’ื™ื“ ืœืงืœืืค ืฉื–ื” ื”ืกื˜ืจืืงื˜ ืฉืžื’ื“ื™ืจ ืืช ื”ืืจื’ื•ืžื ื˜ื™ื ืฉืื ื—ื ื• ืžืฆืคื™ื ืœืงื‘ืœ ืžืฉื•ืจืช ื”ืคืงื•ื“ื”. ืžื” ืฉื ืžืฆื ื‘ืกื•ื’ืจื™ื™ื ื–ื” ืคืจืžื˜ืจื™ื ืฉืงืœืืค ื™ืฉืชืžืฉ ื‘ื”ื, ื‘ืžืงืจื” ืฉืœื ื• ื›ื“ื™ ืœื“ืขืช ืื™ื–ื” ืžื™ื“ืข ืœื”ืฆื™ื’ ื›ืฉืžื™ืฉื”ื• ืžืคืขื™ืœ ืืช ื”ืชื•ื›ื ื™ืช. ืžื” ืฉื™ื•ืชืจ ืžืขื ื™ื™ืŸ ื–ื” ืžื” ืฉืงื•ืจื” ื‘ืชื•ืš ืื•ืชื• ื”ืกื˜ืจืืงื˜ - ื›ืœ ืื—ื“ ืžื”ืฉื“ื•ืช ื‘ื• ื™ื”ืคื•ืš ืœืืจื’ื•ืžื ื˜ ืฉื”ืชื•ื›ื ื™ืช ื™ื›ื•ืœื” ืœืงื‘ืœ ืžืฉื•ืจืช ื”ืคืงื•ื“ื”, ื•ื‘ืขื–ืจืช ื”ืžืืคื™ื™ืŸ arg ืืคืฉืจ ืœื”ื’ื“ื™ืจ ืขื•ื“ ืคืจื˜ื™ื ืœื’ื‘ื™ ืื•ืชื• ืืจื’ื•ืžื ื˜, ืœืžืฉืœ ืœื”ื’ื“ื™ืจ ืื•ืชื• ื‘ืชื•ืจ short (ืฉื–ื” ืื•ืžืจ ืฉื”ื•ื ื™ื•ืคืขืœ ืขื ืื•ืช ืื—ืช) ื•ืœืฆื™ื™ืŸ ืžื” ื”ืื•ืช. ืฉื™ืžื• ืœื‘ ืžื” ืงื•ืจื” ื›ืฉืื ื™ ืžืคืขื™ืœ ืืช ื”ืชื•ื›ื ื™ืช ืขื ื”ืžืชื’ --help:
$ cargo run -- --help
    Finished dev [unoptimized + debuginfo] target(s) in 0.04s
     Running `target/debug/tail --help`
Usage: tail [OPTIONS] [NAME]

Arguments:
  [NAME]

Options:
  -r
  -n <LINES>
  -h, --help      Print help information
  -V, --version   Print version information
ืžืกืš ื”ืขื–ืจื” ืžื™ื•ืฆืจ ืขืœ ื™ื“ื™ ืกืคืจื™ื™ืช clap, ื•ืžืฆื™ื’ ืืช ื›ืœ ื”ืืจื’ื•ืžื ื˜ื™ื ื•ื”ืื•ืคืฆื™ื•ืช ืฉื”ืชื•ื›ื ื™ืช ืžืฆืคื” ืœืงื‘ืœ. ื”ืจืฉื™ืžื” ื”ื–ืืช ื ื‘ื ื™ืช ื™ืฉื™ืจื•ืช ืžื”ืกื˜ืจืืงื˜ CLI. ื‘ื•ืื• ื ืžืฉื™ืš ื•ื ืจืื” ืื™ืš main ืžืคืขื ื— ืืช ื”ืืจื’ื•ืžื ื˜ื™ื ืื—ืจื™ ืฉื”ื’ื“ืจื ื• ืืช ื”ืกื˜ืจืืงื˜:
fn main() {
    let cli = Cli::parse();

    // You can check the value provided by positional arguments, or option arguments
    let lines: usize = cli.lines.unwrap_or(String::from("10")).parse().expect("n is not a number");

    println!("Value for reverse: {}", cli.reverse);
    println!("Value for n = {}", lines);
    println!("name: {:?}", cli.name.as_deref());

    tail_file(cli.name.as_deref(), lines, cli.reverse);
}
ืžืขื˜ ืฉื•ืจื•ืช ืขื ื”ืจื‘ื” ืชื•ื›ืŸ:

ToCode
1 420
ืงื•ื“ ื”ื˜ื™ืคื•ืœ ื‘ None ื•ื‘ Some ืฆืจื™ืš ืœื”ื—ื–ื™ืจ ืืช ืื•ืชื• ื˜ื™ืคื•ืก ืœืžืฉืชื ื” reader, ืื‘ืœ ื”ื‘ืขื™ื” ืฉ BufReader::new ืžื—ื–ื™ืจ ื˜ื™ืคื•ืก ืžื™ื“ืข ืฉื•ื ื” ืœืคื™ ื”ื“ื‘ืจ ืฉื”ื•ื ืงื™ื‘ืœ (ื–ื” ื ืงืจื Generics). ื‘ืฉื‘ื™ืœ ืœืชืงืŸ ืืช ื–ื” ืื ื™ ืขื•ื˜ืฃ ืืช ืฉื ื™ ื” reader-ื™ื ื‘ Box ื•ืžื‘ืงืฉ ืžื”ืงื•ืžืคื™ื™ืœืจ ืœื ืœื”ืงืฆื•ืช ืžืจืืฉ ืžืงื•ื ื‘ื–ื™ื›ืจื•ืŸ ืœ Box, ืืœื ืœื—ืฉื‘ ืืช ื”ื’ื•ื“ืœ ื“ื™ื ืžื™ืช ื‘ื–ืžืŸ ืจื™ืฆื”, ื‘ืขื–ืจืช ื”ืžื™ืœื” ื”ืฉืžื•ืจื” dyn. ืกืš ื”ื›ืœ ื™ื”ื™ื” ืœื™ ื‘ reader ืงื•ืคืกื” ืฉื‘ืชื•ื›ื” ื™ื”ื™ื” BufReader. ืื ื™ ืœื ื™ื•ื“ืข ื‘ื–ืžืŸ ืงื•ืžืคื™ืœืฆื™ื” ืื™ื–ื” BufReader ื‘ื“ื™ื•ืง ื–ื” ื™ื”ื™ื”, ืื‘ืœ ื–ื” ื‘ืกื“ืจ - ื›ื™ ืขื ืฉื ื™ื”ื ืื ื™ ืขื•ื‘ื“ ื‘ืื•ืชื” ืฆื•ืจื”. ## ืœื•ืœืืช ื”ืงืจื™ืื” ืขืฆืžื” ื”ืคื•ื ืงืฆื™ื” reader.lines ืžื—ื–ื™ืจื” ืื•ืกืฃ ืฉืœ ื›ืœ ื”ืฉื•ืจื•ืช ื‘ื“ื‘ืจ ืฉื” Reader ืงื•ืจื ืžืžื ื•, ื‘ื™ืŸ ืื ื–ื” ืงื•ื‘ืฅ ืื• stdin. ืœื›ืŸ ืืคืฉืจ ืœืจื•ืฅ ื‘ืœื•ืœืื”:
for line in reader.lines() {
    let the_line = line.unwrap();
    line_count += 1;
    words_count += the_line.split_whitespace().count();
    char_count += the_line.chars().count() + 1; // +1 because of the newline
}
ื•ืฉื™ืžื• ืœื‘ ืœืคืงื•ื“ื” line.unwrap - ื“ื™ื‘ืจื ื• ืขืœ Option ื•ืจืื™ื ื• ืฉืคื•ื ืงืฆื™ื•ืช ืžืกื•ื™ืžื•ืช ืฉืžื—ื–ื™ืจื•ืช ืขืจืš ืื•ืคืฆื™ื•ื ืืœื™ ืžื—ื–ื™ืจื•ืช Option, ื•ื›ืš "ืžื›ืจื™ื—ื•ืช" ืืช ืžื™ ืฉืงื•ืจื ืœื”ืŸ ืœื‘ื“ื•ืง ืื ื”ื™ื” ืฉื ืขืจืš ืื• ืœื (ื›ืœื•ืžืจ ืžื•ื ืขื•ืช ืžืฆื‘ ืฉืœ ืขื‘ื•ื“ื” ืขื Null Values). ื”ื—ืœื•ืคื” ืœ Option ื”ื™ื Result. ื’ื ื–ื” Enum ืฉื”ืขืจื›ื™ื ืฉื”ื•ื ื™ื›ื•ืœ ืœื”ื—ื–ื™ืง ื”ื Ok ื• Err. ืœ Ok ื™ืฉ ืคืจืžื˜ืจ ืฉื–ื• ื”ืชื•ืฆืื” (ื‘ืžืงืจื” ืฉืœื ื• ื”ืฉื•ืจื” ืฉื ืงืจืื”), ื•ืœ Err ื™ืฉ ืคืจืžื˜ืจ ืฉื–ื• ื”ื•ื“ืขืช ื”ืฉื’ื™ืื”. ื”ืคืงื•ื“ื” unwrap ืฉืœ Result ื‘ื•ื“ืงืช ืืช ืžื” ืฉื›ืชื•ื‘ ื‘ืคื ื™ื, ืื ื–ื” Ok ื”ื™ื ืชื—ื–ื™ืจ ืืช ื”ืชื•ืฆืื” ื•ืื ื–ื” Err ื”ื™ื ืชืจืกืง ืืช ื”ืชื•ื›ื ื™ืช ืขื ื”ื•ื“ืขืช ื”ืฉื’ื™ืื”. ื‘ืชื•ื›ื ื™ื•ืช ื’ื“ื•ืœื•ืช ื›ื“ืื™ ืœื”ื™ื–ื”ืจ ืžืคืงื•ื“ื” ื–ื• ื•ืœื”ืฉืชืžืฉ ื‘ื‘ื“ื™ืงื” ืžืคื•ืจืฉืช ืขื match, ืื‘ืœ ื‘ืœื•ืœืื” ืฉืœื ื• ื–ื” ืขื“ื™ื™ืŸ ื‘ืกื“ืจ ืœืกื™ื™ื ืืช ื”ืชื•ื›ื ื™ืช ืื ืœื ื”ืฆืœื—ื ื• ืœืงืจื•ื ืฉื•ืจื”. ## ืชืจื’ื™ืœื™ื ืœื”ืจื—ื‘ื” ืื—ืจื™ ืฉื”ืคืขืœืชื ืืช ื”ืชื•ื›ื ื™ืช ืืฆืœื›ื ื•ืจืื™ืชื ืฉืืชื ืžืฆืœื™ื—ื™ื ืœื”ืจื™ืฅ ืื•ืชื” ืขื ืฉื ืงื•ื‘ืฅ ื•ื‘ืœื™, ื ืกื• ืืช ื”ืชืจื’ื™ืœื™ื ื”ื‘ืื™ื ืœื”ืจื—ื‘ื”: 1. ื—ืœืงื• ืืช ื” main ืœืฉืชื™ ืคื•ื ืงืฆื™ื•ืช, ืื—ืช ืžืคืขื ื—ืช ืืช ื”ืงืœื˜ ืฉื”ืชืงื‘ืœ ืžืฉื•ืจืช ื”ืคืงื•ื“ื” ื•ื”ืฉื ื™ื” ืžื›ื™ืœื” ืืช ืœื•ืœืืช ื”ืงืจื™ืื” ืžื”ืงื•ื‘ืฅ. 2. ื”ื•ืฆื™ืื• ืืช ื”ืคื•ื ืงืฆื™ื•ืช ืœืงื•ื‘ืฅ ื ืคืจื“, ื•ืฉืœื‘ื• ืื•ืชื• ื‘ main ืขื ืคืงื•ื“ื” mod. 3. ื”ื•ืกื™ืคื• ืชืžื™ื›ื” ื‘ืžืชื’ื™ื ื”ืื•ืคืฆื™ื•ื ืืœื™ื™ื w, c ื•-l ื›ื“ื™ ืฉืืคืฉืจ ื™ื”ื™ื” ืœื”ื“ืคื™ืก ืจืง ืืช ืžืกืคืจ ื”ืฉื•ืจื•ืช, ืžืกืคืจ ื”ืžื™ืœื™ื ืื• ืžืกืคืจ ื”ืชื•ื•ื™ื ื‘ืงืœื˜. ื ืกื• ืœืชืžื•ืš ื’ื ื‘ื›ืชื™ื‘ ื ืคืจื“ ืœืžืฉืœ wc -l -w ื•ื’ื ื‘ื›ืชื™ื‘ ื”ืžืฉื•ืœื‘ wc -cl. 4. ื”ื•ืกื™ืคื• ืืคืฉืจื•ืช ืœืงืจื•ื ืžืกืคืจ ืงื‘ืฆื™ื, ืื ืžืฉืชืžืฉ ืžืขื‘ื™ืจ ืฉืžื•ืช ืฉืœ ืžืกืคืจ ืงื‘ืฆื™ื ื‘ืฉื•ืจืช ื”ืคืงื•ื“ื” ืœืžืฉืœ wc file1.txt file2.txt. ืžื—ืจ ื ื“ื‘ืจ ืขืœ ืกืคืจื™ื™ืช ื”ื”ืจื—ื‘ื” clap ืฉืžืืคืฉืจืช ืœื˜ืคืœ ื‘ืฆื•ืจื” ืžื”ื™ืจื” ื‘ื›ืœ ื”ืืคืฉืจื•ื™ื•ืช ืœืคื™ืขื ื•ื— ืงืœื˜ ืžืฉื•ืจืช ื”ืคืงื•ื“ื”. ืขื“ ืื– ืžื•ื–ืžื ื™ื ืœื”ื“ื‘ื™ืง ืืช ื”ืคื™ืชืจื•ื ื•ืช ืฉืœื›ื ื›ืืŸ ื‘ืชื’ื•ื‘ื•ืช.

ToCode
1 420
# ื™ื•ื 3 - ืžื™ืžื•ืฉ wc ื‘ Rust ื”ื™ื•ื ื ื‘ื ื” ื’ื™ืจืกืช Rust ืœืชื•ื›ื ื™ืช ืฉื•ืจืช ืคืงื•ื“ื” ืคื•ืคื•ืœืจื™ืช ื‘ื™ื•ื ื™ืงืก ืฉื ืงืจืืช wc. ื”ืชื•ื›ื ื™ืช ืกื•ืคืจืช ื›ืžื” ืชื•ื•ื™ื, ืฉื•ืจื•ืช ื•ืžื™ืœื™ื ื”ื™ื ืงื™ื‘ืœื” ื‘ืงืœื˜. ## ืžื” ืื ื—ื ื• ื‘ื•ื ื™ื ืœืกืคื•ืจ ื›ืžื” ืฉื•ืจื•ืช, ืžื™ืœื™ื ื•ืชื•ื•ื™ื ื™ืฉ ื‘ืงืœื˜ ื–ื” ืœื ื”ื—ืœืง ื”ืงืฉื” ื‘ื‘ื ื™ื™ืช wc, ืืœื ื”ืื™ื ื˜ื’ืจืฆื™ื” ืฉืœื” ืขื ื”ืขื•ืœื- 1. ื”ืชื•ื›ื ื™ืช ื™ื›ื•ืœื” ืœืงื‘ืœ ืฉื ืงื•ื‘ืฅ ืžืฉื•ืจืช ื”ืคืงื•ื“ื”, ื•ืื– ื”ื™ื ืชืงืจื ืืช ื›ืœ ื”ืงืœื˜ ืžืื•ืชื• ืงื•ื‘ืฅ. 2. ืื ืœื ืงื™ื‘ืœื” ืฉื ืงื•ื‘ืฅ ื”ืชื•ื›ื ื™ืช ืชืงืจื ืืช ื”ืงืœื˜ ืž Standard Input. ืœื›ืŸ ื”ืืชื’ืจื™ื ืฉืœื ื• ื”ื™ื•ื ื™ื”ื™ื• ืœืœืžื•ื“ ืื™ืš ืงื•ืจืื™ื ืžื™ื“ืข ืžืงื‘ืฆื™ื ื•ืื™ืš ืงื•ืจืื™ื ืž Standard Input, ื•ืื™ืš ืœื›ืชื•ื‘ ืคื•ื ืงืฆื™ื” ืฉื™ื•ื“ืขืช ืœืงืจื•ื ืžืฉื ื™ ื”ืžืงื•ืจื•ืช ื‘ืื•ืชื” ืฆื•ืจื”. ## ืงื•ื“ ื”ืชื•ื›ื ื™ืช ื”ืงื•ื“ ื”ืคืขื ืงืฆืจ. ืชื—ื™ืœื” ื”ื“ื‘ืงื” ื•ืื—ืจื™ื” ื”ืกื‘ืจื™ื:
use std::env;
use std::fs;
use std::io::{self, BufRead, BufReader};

fn main() {
    let input = env::args().nth(1);
    let reader: Box<dyn BufRead> = match input {
        None => Box::new(BufReader::new(io::stdin())),
        Some(filename) => Box::new(BufReader::new(fs::File::open(filename).unwrap()))
    };

    let mut line_count: usize = 0;
    let mut char_count: usize = 0;
    let mut words_count: usize = 0;

    for line in reader.lines() {
        let the_line = line.unwrap();
        line_count += 1;
        words_count += the_line.split_whitespace().count();
        char_count += the_line.chars().count() + 1; // +1 because of the newline
    }

    println!("{} {} {}", line_count, words_count, char_count);
}
## ืงืจื™ืืช ืฉื ื”ืงื•ื‘ืฅ ืžืฉื•ืจืช ื”ืคืงื•ื“ื” ื‘ื—ืœืง ื”ืจืืฉื•ืŸ ืฉืœ ื”ืชื•ื›ื ื™ืช ืื ื™ ืงื•ืจื ืืช ืฉื ื”ืงื•ื‘ืฅ ืžื”ืืจื’ื•ืžื ื˜ ื”ืฉื ื™ ืžืฉื•ืจืช ื”ืคืงื•ื“ื”, ื‘ื“ื™ื•ืง ื›ืžื• ืฉืจืื™ื ื• ื‘ื“ื•ื’ืžื” ืžืืชืžื•ืœ. ืžื” ืฉืฉื•ื ื” ื”ืคืขื ื”ื•ื ืฉืื ื™ ื ืฉืืจ ืขื Option<String> ื‘ื’ืœืœ ืฉื”ืคืจืžื˜ืจ ืื•ืคืฆื™ื•ื ืืœื™ - ืื•ืœื™ ื™ื”ื™ื” ืฉื ืงื•ื‘ืฅ, ื•ืื•ืœื™ ืœื ื•ืื– ื ืฆื˜ืจืš ืœืงืจื•ื ืž stdin. ื‘ื”ื™ื ืชืŸ Option (ื‘ Rust ื–ื” ื ืงืจื enum), ืื ื™ ื™ื›ื•ืœ ืœื˜ืคืœ ื‘ื›ืœ ื”ืืคืฉืจื•ื™ื•ืช ืฉืœื• ืขื ืคืงื•ื“ืช match. ื‘ื•ืื• ื ื ืกื” ืืช ื–ื” ื‘ื“ื•ื’ืžื” ืคืฉื•ื˜ื” ื‘ Playground ืœืคื ื™ ืฉื ืžืฉื™ืš ืœืงืจื•ื ืืช ื”ืงื•ื“ ืฉืœ wc. ื ืชื—ื™ืœ ืขื ื” enum ื”ืจืืฉื•ืŸ ืฉืžื’ื“ื™ืจ 3 ืฆื‘ืขื™ื:
enum Color {
    Red,
    Blue,
    Green
}

fn main() {
    let my_color = Color::Red;
    match my_color {
        Color::Red => println!("It's red!"),
        Color::Blue => println!("It's blue!"),
        Color::Green => println!("It's green!"),
    }
}
ื”ืคืงื•ื“ื” match ืžืงื‘ืœืช ืžืฉืชื ื” ื•ื‘ื•ื“ืงืช ืื ื”ื•ื ืžืชืื™ื ืœื›ืœ ืื—ืช ืžื”ืืคืฉืจื•ื™ื•ืช. ื‘ืขื™ืงืจื•ืŸ ืืคืฉืจ ืœื”ืฉืชืžืฉ ื‘ match ืœื›ืœ ืกื•ื’ ืžืฉืชื ื”, ืื‘ืœ ืœ enum ื”ื•ื ืžืชืื™ื ื›ืžื• ื›ืคืคื” ืœื™ื“. enum-ื™ื ื‘ืจืืกื˜ ื™ื›ื•ืœื™ื ื’ื ืœื”ื—ื–ื™ืง ืขืจืš (ืื• ื›ืžื”), ื•ืื– ืืคืฉืจ ืœื›ืชื•ื‘ ื“ื‘ืจื™ื ืžื“ืœื™ืงื™ื ื”ื“ื•ื’ืžื” ื”ื‘ืื” ืžื”ืกืคืจ Rust By Example:
enum WebEvent {
    // An `enum` may either be `unit-like`,
    PageLoad,
    PageUnload,
    // like tuple structs,
    KeyPress(char),
    Paste(String),
    // or c-like structures.
    Click { x: i64, y: i64 },
}

// A function which takes a `WebEvent` enum as an argument and
// returns nothing.
fn inspect(event: WebEvent) {
    match event {
        WebEvent::PageLoad => println!("page loaded"),
        WebEvent::PageUnload => println!("page unloaded"),
        // Destructure `c` from inside the `enum`.
        WebEvent::KeyPress(c) => println!("pressed '{}'.", c),
        WebEvent::Paste(s) => println!("pasted \"{}\".", s),
        // Destructure `Click` into `x` and `y`.
        WebEvent::Click { x, y } => {
            println!("clicked at x={}, y={}.", x, y);
        },
    }
}
ื•ื–ื” ื™ืคื” ื›ื™ ื” match ืžืชืื™ื ืœืžื‘ื ื” ืฉืœ ื” Enum, ื•ื’ื ืžืืคืฉืจ ืœื”ื’ื“ื™ืจ ืžืฉืชื ื™ื ืฉื™ืงื—ื• ืืช ื”ืขืจื›ื™ื ืžืชื•ืš ื” enum. ื‘ืงื•ื“ ืฉืœ wc ืจืฉืžืชื™ ืืช ื”ื‘ื™ื˜ื•ื™ ื”ื‘ื:
let reader: Box<dyn BufRead> = match input {
    None => Box::new(BufReader::new(io::stdin())),
    Some(filename) => Box::new(BufReader::new(fs::File::open(filename).unwrap()))
};
ื”ืงื•ื“ ื‘ื•ื“ืง ืืช ื”ืขืจืš ืฉืœ input ืžื•ืœ ืฉืชื™ ื”ืืคืฉืจื•ื™ื•ืช ืฉืœ Option - ืื• ืฉื™ืฉ ืฉื Some, ื•ืื– ื”ืคืจืžื˜ืจ ื”ื•ื ืฉื ื”ืงื•ื‘ืฅ, ืื• ืฉื™ืฉ ืฉื None ื•ืื– ืื™ืŸ ืœื ื• ืฉื ืงื•ื‘ืฅ ื•ืขืœื™ื ื• ืœืงืจื•ื ืืช ื”ืงืœื˜ ืž stdin. ## ื™ืฆื™ืจืช ื” reader

ToCode
1 420
let mut result = String::with_capacity(text.len());
  let first_char_numeric_value = 'a' as u8;
  let shift = 13;
  let number_of_characters = 26;

  for ch in text.chars() {
      let current_char_numeric_value = ch as u8;
      let next_char = (((
          (current_char_numeric_value - first_char_numeric_value) + shift) 
          % number_of_characters)
          + first_char_numeric_value)
      as char;

      result.push(next_char);
  }

  return result;
}
ื‘ืงื•ื‘ืฅ main ืื ื™ ืฆืจื™ืš ืœื˜ืขื•ืŸ ืืช ื”ืงื•ื‘ืฅ ื”ื—ื™ืฆื•ื ื™ ืฉื™ืฆืจืชื™. ื‘ื’ืœืœ ืฉื”ืงื•ื‘ืฅ utils.rs ื”ื•ื ื—ืœืง ืžื”ืคืจื•ื™ืงื˜ ื”ืคืงื•ื“ื” ืœื˜ืขื•ืŸ ืื•ืชื• ื”ื™ื mod, ื•ืœื›ืŸ ืื ื™ ืžื•ืกื™ืฃ ืฉื•ืจื” ืจืืฉื•ื ื” ื—ื“ืฉื” ืœืงื•ื‘ืฅ main.rs:
mod utils;
ื•ืžืฉื ื” ืืช ื”ืงืจื™ืื” ืž rot13 ืœ utils::rot13. ืกืš ื”ื›ืœ ื”ืงื•ื‘ืฅ ื ืจืื” ื›ืš:
mod utils;

fn main() {
    let input_word = std::env::args().nth(1).expect("Usage: rot13 text-string");
    let output = utils::rot13(&input_word);

    println!("{}", output);
}
ื‘ืขื‘ื•ื“ื” ืขื ืงื‘ืฆื™ื ื—ื™ืฆื•ื ื™ื™ื ื”ืจื‘ื” ืคืขืžื™ื ื ืจืฆื” ืœืงืฆืจ ืืช ื”ืฉืžื•ืช ื•ืœื ืœื›ืชื•ื‘ ืืช ื›ืœ ื”"ื ืชื™ื‘" ืœืคื•ื ืงืฆื™ื”, ื›ืœื•ืžืจ ืœื—ื–ื•ืจ ืœื›ืชื•ื‘ rot13 ื‘ืžืงื•ื utils::rot13. ื”ืคืงื•ื“ื” use ืžืืคืฉืจืช ืœื—ื‘ืจ ืคื•ื ืงืฆื™ื” ืžืžื•ื“ื•ืœ ืื—ืจ ืืœื™ื ื•, ื›ืš ืฉืœื ื ืฆื˜ืจืš ืœื”ื•ืกื™ืฃ ืœื” ืืช ืฉื ื”ืžื•ื“ื•ืœ ื‘ืชื•ืจ ืชื—ื™ืœื™ืช. ื–ื” ื ืจืื” ื›ื›ื”:
mod utils;
use std::env;
use utils::rot13;

fn main() {
    let input_word = env::args().nth(1).expect("Usage: rot13 text-string");
    let output = rot13(&input_word);

    println!("{}", output);
}
## ื‘ื ื™ื” ืœ Release ื”ืจืฆื” ืขื cargo run ืžืชืื™ืžื” ืœืžืฆื‘ ืคื™ืชื•ื— ืื‘ืœ ืื ืชื ืกื• ืœืžื“ื•ื“ ื–ืžื ื™ื ืชื’ืœื• ืฉื”ืชื•ื›ื ื™ืช ืจืฆื” ื™ื—ืกื™ืช ืœืื˜. ื‘ืฉื‘ื™ืœ ืœื‘ื ื•ืช ืืช ื”ืชื•ื›ื ื™ืช ื‘ืžืฆื‘ Release ื›ื“ื™ ืฉืชื•ื›ืœื• ื’ื ืœืฉืœื•ื— ืื•ืชื” ืœื—ื‘ืจื™ื ื ืคืขื™ืœ:
cargo build -r
ืื—ืจื™ ื–ื” ืืคืฉืจ ืœื”ืคืขื™ืœ ืืช ื”ืชื•ื›ื ื™ืช ื‘ื’ื™ืจืกื” ื”ืžื”ื™ืจื” ืฉืœื”:
./target/release/rot13 hello
## ืชืจื’ื™ืœื™ ื”ืจื—ื‘ื” ืจื•ืฆื™ื ืœื•ื•ื“ื ืฉื”ื‘ื ืชื ื•ืœืœืžื•ื“ ืขื•ื“ ืงืฆืช ืขืœ ืจืืกื˜? ื ืกื• ืืช ื”ืชืจื’ื™ืœื™ื ื”ื‘ืื™ื: 1. ื”ืขืชื™ืงื• ืืœื™ื›ื ืืช ื”ืžืื’ืจ ืขื ืงื•ื“ ื”ืชื•ื›ื ื™ืช. 2. ื”ืจื™ืฆื• ืืช ื”ืชื•ื›ื ื™ืช ื›ื“ื™ ืœืจืื•ืช ืฉื”ื›ืœ ืขื•ื‘ื“ ืœื›ื. 3. ืขื“ื›ื ื• ืืช ื”ืงื•ื“ ื›ืš ืฉื™ืงื‘ืœ ืคืจืžื˜ืจ ืฉื•ืจืช ืคืงื•ื“ื” (ืื•ืคืฆื™ื•ื ืืœื™) ื ื•ืกืฃ ืฉื™ื’ื“ื™ืจ ื‘ื›ืžื” ืœื”ื–ื™ื– ื›ืœ ืชื•. ื‘ืจื™ืจืช ื”ืžื—ื“ืœ ื”ื™ื 13. 4. ืขื“ื›ื ื• ืืช ื”ืงื•ื“ ื›ื“ื™ ืœืชืžื•ืš ื’ื ื‘ืื•ืชื™ื•ืช ื’ื“ื•ืœื•ืช ื‘ืื ื’ืœื™ืช ื•ื‘ืชื•ื•ื™ื ื ื•ืกืคื™ื ื›ืžื• ืกื™ืžื ื™ ื ื™ืงื•ื“ ืื• ืจื•ื•ื—. ืืช ืกื™ืžื ื™ ื”ื ื™ืงื•ื“ ื•ื”ืจื•ื•ื— ืœื ืฆืจื™ืš ืœืฉื ื•ืช. 5. ื‘ืขื–ืจืช ืžืฉืชื ื” ืกื‘ื™ื‘ื” ื”ื•ืกื™ืคื• ืœืชื•ื›ื ื™ืช ืžืฆื‘ Debug. ืื ืžืฉืชื ื” ื”ืกื‘ื™ื‘ื” DEBUG ืžื•ื’ื“ืจ, ื”ืชื•ื›ื ื™ืช ืชื“ืคื™ืก ืฉื•ืจืช Debug ืœื›ืœ ืชื• ื‘ืžื—ืจื•ื–ืช ื‘ื• ื™ื•ื“ืคืก ื”ืชื• ื”ืžืงื•ืจื™ ื•ื”ืชื• ืื—ืจื™ ื”ื—ืœืคื”. ืืคืฉืจ ืœืงืจื•ื ืขืœ ืขื‘ื•ื“ื” ืขื ืžืฉืชื ื™ ืกื‘ื™ื‘ื” ื‘ืจืืกื˜ ื‘ืกืคืจ. ืžื•ื–ืžื ื™ื ืœื”ื“ื‘ื™ืง ืคื” ื‘ืชื’ื•ื‘ื•ืช ืืช ื”ืคื™ืชืจื•ื ื•ืช ืฉืœื›ื ืœืชืจื’ื™ืœื™ ื”ื”ืจื—ื‘ื”, ื•ืื ื—ื ื• ื ืžืฉื™ืš ืžื—ืจ ืขื ืชื•ื›ื ื™ืช ืจืืกื˜ ื ื•ืกืคืช.

ToCode
1 420
# ื™ื•ื 2 - ืชื•ื›ื ื™ืช rot13 ื‘ Rust ืื—ืจื™ ืฉืœืžื“ื ื• ืื™ืš ืœื›ืชื•ื‘ ื›ืžื” ืชื•ื›ื ื™ื•ืช ืจืืฉื•ื ื•ืช ื‘ Rust ื‘ืขื ืŸ ื•ืžืงื•ืžื™ืช, ื ื ืกื” ื”ื™ื•ื ืœืžืžืฉ ืืœื’ื•ืจื™ืชื ืคืฉื•ื˜ ืฉื ืงืจื rot13. ## ืžื” ืื ื—ื ื• ื‘ื•ื ื™ื ื›ืชื‘ื• ืชื•ื›ื ื™ืช ืฉืžืงื‘ืœืช ื›ืงืœื˜ ืžืฉื•ืจืช ื”ืคืงื•ื“ื” ืžื—ืจื•ื–ืช ื˜ืงืกื˜ ื•ืžื“ืคื™ืกื” ื‘ื—ื–ืจื” ืืช ื”ืžื—ืจื•ื–ืช ืžืงื•ื“ื“ืช ื‘ rot13, ื›ืœื•ืžืจ ื›ืœ ืื•ืช ื‘ืžื—ืจื•ื–ืช ืžื•ื—ืœืคืช ื‘ืื•ืช ืฉื ืžืฆืืช ื‘ื“ื™ื•ืง 13 ืžืงื•ืžื•ืช ืื—ืจื™ื” ื‘ abc, ืœื“ื•ื’ืžื” ื›ืœ a ืชื•ื—ืœืฃ ื‘ n, ื›ืœ b ืชื•ื—ืœืฃ ื‘ o ื•ื›ืš ื”ืœืื”. ื›ืฉืขื•ื‘ืจื™ื ืืช z ืžืชื—ื™ืœื™ื ืžื”ื”ืชื—ืœื” ืœื›ืŸ ื›ืœ n ืชื•ื—ืœืฃ ืฉื•ื‘ ื‘ a. ื‘ืฉื‘ื™ืœ ื”ืคืฉื˜ื•ืช ื ื˜ืคืœ ืจืง ื‘ืžื—ืจื•ื–ื•ืช ืฉืžื›ื™ืœื•ืช ืื•ืชื™ื•ืช ืงื˜ื ื•ืช ื‘ืื ื’ืœื™ืช ื‘ืœื‘ื“. ## ืงื•ื“ ื”ืชื•ื›ื ื™ืช ืืช ื›ืœ ื”ืงื•ื“ ืœืชื•ื›ื ื™ืช (ื•ื’ื ืœื›ืœ ื”ืชื•ื›ื ื™ื•ืช ื‘ื”ืžืฉืš ื”ืžื“ืจื™ืš) ืชื•ื›ืœื• ืœืžืฆื•ื ื‘ืจื™ืคื• rust-8-days. ื›ื™ื•ื•ืŸ ื˜ื•ื‘ ืœื”ืชื—ืœื” ื™ื”ื™ื” ืœื™ื™ืฆืจ ืžื—ืจื•ื–ืช ื—ื“ืฉื” ืจื™ืงื”, ืœืจื•ืฅ ื‘ืœื•ืœืื” ืขืœ ื›ืœ ื”ืชื•ื•ื™ื ื‘ืžื—ืจื•ื–ืช ื”ืžืงื•ืจื™ืช ื•ื›ืœ ืคืขื ืฉืคื•ื’ืฉื™ื ืชื• ืœื”ื•ืกื™ืฃ ืืช ื”ืชื• "ื”ืžื•ื—ืœืฃ" ืฉืœื• ืœืžื—ืจื•ื–ืช ื”ืชื•ืฆืื”. ื‘ืฉื‘ื™ืœ ื–ื” ืื ื™ ืฆืจื™ืš ืฉื ื™ ื“ื‘ืจื™ื: 1. ืœื”ื‘ื™ืŸ ืื™ืš ืœืจื•ืฅ ื‘ืœื•ืœืื” ืขืœ ื›ืœ ื”ืชื•ื•ื™ื ื‘ืžื—ืจื•ื–ืช. 2. ืœื”ื‘ื™ืŸ ืื™ืš ืœื—ืฉื‘ ืžืชื•ืš ืชื• ืืช ื”ืชื• ืฉื ืžืฆื 13 ืžืงื•ืžื•ืช ืื—ืจื™ื•. ื ืชื—ื™ืœ ื‘ืžืฉื™ืžื” ื”ืจืืฉื•ื ื” ื•ืขื ื”ืœื•ืœืื” ื”ื‘ืื”:

fn rot13(text: &String) -> String {
    let mut result = String::with_capacity(text.len());
    for ch in text.chars() {
        result.push(ch);
    }

    return result;
}

fn main() {
    let input_word = "about".to_string();
    let output = rot13(&input_word);

    println!("{}", output);
}
ื–ื” ืขื‘ืจ ืื‘ืœ ื‘ื™ื ืชื™ื™ื ืžื“ืคื™ืก ื‘ื“ื™ื•ืง ืืช ืื•ืชื” ืžื—ืจื•ื–ืช ืื™ืชื” ื”ืชื—ืœื ื•. ื”ืฉืœื‘ ื”ื‘ื ื™ื”ื™ื” ืœื”ื—ืœื™ืฃ ืืช ch ื‘ืชื• ืฉืžื’ื™ืข 13 ืชื•ื•ื™ื ืื—ืจื™ื•, ื•ืœื—ื–ื•ืจ ืœื”ืชื—ืœื” ืื ืขื‘ืจื ื• ืืช z. ื’ื™ืจืกื” ืฉื ื™ื” ืฉืœ ื”ืงื•ื“ ื”ื™ื:
fn rot13(text: &String) -> String {
    let mut result = String::with_capacity(text.len());
    let first_char_numeric_value = 'a' as u8;
    let shift = 13;
    let number_of_characters = 26;

    for ch in text.chars() {
        let current_char_numeric_value = ch as u8;
        let next_char = (((
            (current_char_numeric_value - first_char_numeric_value) + shift) 
            % number_of_characters)
            + first_char_numeric_value)
        as char;

        result.push(next_char);
    }

    return result;
}
ื”ืคืงื•ื“ื” as ืžืืคืฉืจืช ืœื”ืžื™ืจ ืž char ืœืขืจืš ื”ืžืกืคืจื™ ืฉืœื•, ื•ืžืžืกืคืจ ื‘ื—ื–ืจื” ืœ char. ื—ื•ืฅ ืžื–ื” ืื ื—ื ื• ื ืฉืืจื™ื ืขื ื—ื™ื‘ื•ืจ ื•ืฉืืจื™ืช ืฉืื ื—ื ื• ืžื›ื™ืจื™ื ืžืžืงื•ืžื•ืช ืื—ืจื™ื. ## ืงื‘ืœืช ืงืœื˜ ืžืฉื•ืจืช ื”ืคืงื•ื“ื” ื‘ืฉื‘ื™ืœ ืœืงื‘ืœ ืžื—ืจื•ื–ืช ื˜ืงืกื˜ ืžืฉื•ืจืช ื”ืคืงื•ื“ื” ื‘ืžืงื•ื ืœื”ืฉืชืžืฉ ื‘ืžื™ืœื” ื”ืฉืžื•ืจื” hello ืื ื™ ืžืฉืชืžืฉ ื‘ืคืงื•ื“ื” ื”ื‘ืื”:
let input_word = std::env::args().nth(1).expect("Usage: rot13 text-string");
ืื ื—ื ื• ืจื•ืฆื™ื ืœื’ืฉืช ืœืชื ื”ืฉื ื™ ื‘ืžืขืจืš env::args ื•ืœื›ืŸ ืžืคืขื™ืœื™ื ืืช nth. ืžืขื ื™ื™ืŸ ืœืฉื™ื ืœื‘ ืฉื”ื’ื™ืฉื” ืœืชื ืœื ืžื—ื–ื™ืจื” ืžื—ืจื•ื–ืช ืืœื ืžืฉื”ื• ืฉื ืงืจื Option<String>, ืื• "ืื•ืคืฆื™ื” ืœืžื—ืจื•ื–ืช". ืจืืกื˜ ืื•ืžืจ ืœื ื• ืฉืื•ืœื™ ื™ืฉ ืžื—ืจื•ื–ืช ื‘ืชื ื”ืฉื ื™ ืื‘ืœ ืื•ืœื™ ืžืฉืชืžืฉ ื’ื ืœื ื”ืขื‘ื™ืจ ืขืจืš. ื” Option ื”ื•ื ื”ื“ืจืš ืฉืœ ืจืืกื˜ ืœื˜ืคืœ ื‘ืฉื’ื™ืื•ืช ื‘ืฆื•ืจื” ืžื•ื‘ื ื™ืช: 1. ื›ืœ ืคื•ื ืงืฆื™ื” ืฉืขืฉื•ื™ื” ืœื”ื™ื›ืฉืœ ืžื—ื–ื™ืจื” Option (ืื• Result, ืื‘ืœ ืขืœื™ื• ืขื•ื“ ื ื“ื‘ืจ). 2. ื‘ืฉื‘ื™ืœ ืœื’ืฉืช ืœื“ื‘ืจ ืฉื”ืคื•ื ืงืฆื™ื” ื”ื—ื–ื™ืจื”, ืฆืจื™ืš ืœื”ืฉืชืžืฉ ื‘ืคื•ื ืงืฆื™ื•ืช "ืฉื—ืจื•ืจ" ืฉืœ ืจืืกื˜, ืฉืžื›ืจื™ื—ื•ืช ืื•ืชื ื• ืœื”ืขื‘ื™ืจ ืขืจืš ื‘ืจื™ืจืช ืžื—ื“ืœ ืื• ื”ื•ื“ืขืช ืฉื’ื™ืื” ืื ืื ื—ื ื• ืžืขื“ื™ืคื™ื ืœื”ื™ื›ืฉืœ. ืœื“ื•ื’ืžื” ื”ืคื•ื ืงืฆื™ื” expect ื‘ื” ื”ืฉืชืžืฉืชื™ ืžืงื‘ืœืช ื”ื•ื“ืขื”, ื•ืื ื” Option ืจื™ืง ื”ื™ื ืชื™ื›ืฉืœ ืขื ื”ื”ื•ื“ืขื” ืฉื”ืขื‘ืจืชื™. ืขื›ืฉื™ื• ื›ืฉืื ื™ ืžืคืขื™ืœ ืืช ื”ืชื•ื›ื ื™ืช ืขื cargo run ืื ื™ ืžืงื‘ืœ:
Compiling rot13 v0.1.0 (/Users/ynonp/tmp/rust/rust-in-seven-days/day1/rot13)
    Finished dev [unoptimized + debuginfo] target(s) in 0.25s
     Running `target/debug/rot13`
thread 'main' panicked at 'Usage: rot13 text-string', src/main.rs:25:41
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
ืื‘ืœ ืื ืื ื™ ืžืขื‘ื™ืจ ืžื™ืœื” ื‘ืชื•ืจ ืืจื’ื•ืžื ื˜ ืืงื‘ืœ ืื•ืชื” ื‘ืชื•ืจ ื” input_word ื•ื”ืงื•ื“ ื™ืจื•ืฅ:
cargo run hello
    Finished dev [unoptimized + debuginfo] target(s) in 0.03s
     Running `target/debug/rot13 hello`
uryyb
## ื”ื•ืฆืืช ื”ืคื•ื ืงืฆื™ื” ืœืงื•ื‘ืฅ ื ืคืจื“ ืœืื•ืจืš ื–ืžืŸ ืื•ืœื™ ื ืจืฆื” ืœื”ื•ืกื™ืฃ ืขื•ื“ ืคื•ื ืงืฆื™ื•ืช ื”ืžืจื” ื•ืขื•ื“ ื™ื›ื•ืœื•ืช ืœืชื•ื›ื ื™ืช ืฉืœื ื•, ื•ืœื›ืŸ ื™ื”ื™ื” ื ื—ืžื“ ืื ื›ื‘ืจ ืขื›ืฉื™ื• ื ืœืžื“ ืื™ืš ืœืคืฆืœ ืืช ื”ืชื•ื›ื ื™ืช ืœืžืกืคืจ ืงื‘ืฆื™ื. ื‘ืฉื‘ื™ืœ ืœืงื—ืช ืืช ื”ืคื•ื ืงืฆื™ื” rot13 ืœืงื•ื‘ืฅ ืื—ืจ ืื ื™ ื™ื•ืฆืจ ืงื•ื‘ืฅ ื—ื“ืฉ ื‘ืฉื utils.rs ื‘ืื•ืชื” ืชื™ืงื™ื” ืฉืœ main.rs, ืžืขื‘ื™ืจ ืืœื™ื• ืืช ืงื•ื“ ื”ืคื•ื ืงืฆื™ื” ื•ืžื•ืกื™ืฃ ืืช ื”ืชื—ื™ืœื™ืช pub. ืชื•ื›ืŸ ื”ืงื•ื‘ืฅ ื”ื•ื ืœื›ืŸ:
pub fn rot13(text: &String) -> String {

ToCode
1 420
cost: i32,
}

impl Book {
    fn describe(&self) {
        println!("{} was written by {}. It costs {}$", self.title, self.author_name, self.cost);
    }
}


fn main() {
    let b1 = Book { title: "The Picture of Dorian Gray".to_string(), author_name: "Oscar Wilde".to_string(), cost: 0 };
    let b2 = Book { title: "Dracula".to_string(), author_name: "Mary Wollstonecraft Shelley".to_string(), cost: 0 };
    let b3 = Book { title: "Jane Eyre".to_string(), author_name: "Charlotte Brontรซ".to_string(), cost: 0 };
    let car = ToyCar { color: "green".to_string(), cost: 15 };

    b1.describe();
    b2.describe();
    b3.describe();

    b1.sell();
    car.sell();
}
ืฉื™ื˜ืช ื ื™ื”ื•ืœ ื”ื–ื™ื›ืจื•ืŸ ื•ื”ืขื‘ื•ื“ื” ืขื Struct-ื™ื ื”ื ืœื“ืขืชื™ ืฉื ื™ ื”ื—ืœืงื™ื ื”ื›ื™ ืžื•ืจื›ื‘ื™ื ื‘ Rust. ืื ื™ ืžืงื•ื•ื” ืฉืื—ืจื™ ืงืจื™ืืช ื”ืคื•ืกื˜ ื“ื‘ืจื™ื ื ืจืื™ื ืงืฆืช ื”ื’ื™ื•ื ื™ื™ื, ื•ื‘ื˜ื•ื— ืฉื‘ื”ืžืฉืš ื”ืกื™ื“ืจื” ื•ื›ื›ืœ ืฉื ืจืื” ืขื•ื“ ื“ื•ื’ืžืื•ืช ื“ื‘ืจื™ื ื™ืจืื• ืืคื™ืœื• ื™ื•ืชืจ ื”ื’ื™ื•ื ื™ื™ื. ## ืชืจื’ื™ืœื™ื ืœื”ืจื—ื‘ื” ืจื•ืฆื™ื ืœืจืื•ืช ืฉื”ื‘ื ืชื ืืช ื›ืœ ืžื” ืฉื”ืœืš ืคื”, ื•ืœื”ืชืืžืŸ ืขืœ ืจืืกื˜ ืขื“ ื”ืคื•ืกื˜ ืฉืœ ืžื—ืจ? ื”ื ื” ื›ืžื” ืจืขื™ื•ื ื•ืช: 1. ื”ืชืงื™ื ื• ืจืืกื˜ ืืฆืœื›ื ืขืœ ื”ืžื›ื•ื ื”. 2. ื›ืชื‘ื• ืชื•ื›ื ื™ืช ืจืืกื˜ ืฉืžื•ืฆืืช ืืช ื›ืœ ื”ืžืกืคืจื™ื ื”ืจืืฉื•ื ื™ื™ื ื‘ื™ืŸ 1 ืœ 100. 3. ื›ืชื‘ื• ืชื•ื›ื ื™ืช ืจืืกื˜ ืฉืžื’ืจื™ืœื” ืžื—ืจื•ื–ืช ื‘ืช 6 ืชื•ื•ื™ื - ื”ืชื•ื›ื ื™ืช ืชืจื•ืฅ ื‘ืœื•ืœืื” ื•ื›ืœ ืื™ื˜ืจืฆื™ื” ืชื•ืกื™ืฃ ืขื•ื“ ืื•ืช ืœืžื—ืจื•ื–ืช. 4. ื›ืชื‘ื• Struct ื‘ Rust ืฉืžื™ื™ืฆื’ ืื•ืกืฃ ืกื™ืกืžืื•ืช (ื›ืŸ ืชืฆื˜ืจื›ื• ืœืžืฆื•ื ืื™ืš ืžื’ื“ื™ืจื™ื ืžืขืจืš ื‘ Rust). ื”ื’ื“ื™ืจื• ืคื•ื ืงืฆื™ื” ืฉืžืงื‘ืœืช ืฉื ืฉืœ ืืชืจ, ืžื’ืจื™ืœื” ืขื‘ื•ืจื• ืกื™ืกืžื” ื•ืฉื•ืžืจืช ืื•ืชื• ื‘ืžืขืจืš ื”ืกื™ืกืžืื•ืช, ื•ืคื•ื ืงืฆื™ื” ื ื•ืกืคืช ืฉืžืงื‘ืœืช ืฉื ืฉืœ ืืชืจ ื•ืžื—ื–ื™ืจื” ืืช ื”ืกื™ืกืžื” ืฉื”ื•ื’ืจืœื” ืขื‘ื•ืจ ืื•ืชื• ืืชืจ. 5. ื‘ Struct ืฉืœ ืกืคืจ ื›ืชื‘ืชื™:
impl Book {
    fn describe(&self) {
        println!("{} was written by {}. It costs {}$", self.title, self.author_name, self.cost);
    }
}
ื‘ืฉื‘ื™ืœ ืžื” ื”ื™ื™ืชื™ ืฆืจื™ืš ืืช ืกื™ืžืŸ ื” & ืœืคื ื™ ื” self? ืžื” ื™ืงืจื” ืื ื ื•ื•ืชืจ ืขืœื™ื•?

ToCode
1 420
let mut name = String::from("hello");
    
    change_name(&mut name);
    change_name(&mut name);
    change_name(&mut name);

    print_name(&name);
    print_name(&name);
    print_name(&name);

    println!("My name is still {}", name);
}
ื”ืคื•ื ืงืฆื™ื” change_name ืจื•ืฆื” ืœืงื—ืช ืืช name ื•ืœืฉื ื•ืช ืื•ืชื•, ื•ืœื›ืŸ ื”ื™ื ืฆืจื™ื›ื” ืœืฆื™ื™ืŸ ืืช ื–ื” ื‘ื—ืชื™ืžื” ืฉืœื”, ื•ื‘ืงืจื™ืื” ืืœื™ื” ืื ื—ื ื• ืžืžืฉ ืฆืจื™ื›ื™ื ืœื”ื’ื™ื“ ืฉืื ื—ื ื• ืžืขื‘ื™ืจื™ื ื’ื™ืจืกื” ื ื™ืชื ืช ืœืฉื™ื ื•ื™ ืฉืœ ื”ืžืฉืชื ื”. ื›ื›ืœ ืฉื ื›ืชื•ื‘ ื™ื•ืชืจ ืงื•ื“ Rust ื ืจืื” ื™ื•ืชืจ ื“ืจื›ื™ื ื™ืฆื™ืจืชื™ื•ืช ืœื”ืขื‘ื™ืจ ืžืฉืชื ื™ื ื‘ื™ืŸ ืคื•ื ืงืฆื™ื•ืช ื•ื ืฆื˜ืจืš ืœื–ื›ื•ืจ ืœื‘ื“ื•ืง ืžื™ ื” Owner ืฉืœ ื›ืœ ืžื™ื“ืข ื‘ืžื”ืœืš ืจื™ืฆืช ื”ืชื•ื›ื ื™ืช. ## ืกื˜ืจืืงื˜ื™ื ื‘ Rust ืจื›ื™ื‘ ืžืจื›ื–ื™ ื ื•ืกืฃ ื‘ืฉืคืช Rust ื”ื•ื ื” Struct. ืืคืฉืจ ืœื—ืฉื•ื‘ ืขืœ ืกื˜ืจืืงื˜ ื›ืžื• ืื•ื‘ื™ืงื˜ ื‘ืฉืคืช JavaScript, ืจืง ื‘ืœื™ ื”ืคื•ื ืงืฆื™ื•ืช. ืกื˜ืจืืงื˜ ืžื—ื–ื™ืง ืžื™ื“ืข ื•ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœื›ืชื•ื‘ ืคื•ื ืงืฆื™ื•ืช ืฉื™ื”ื™ื• "ืงืฉื•ืจื•ืช" ืœืื•ืชื• ืกื˜ืจืืงื˜. ื‘ื ื•ืกืฃ ืืคืฉืจ ืœื›ืชื•ื‘ ืื•ืกืคื™ื ืฉืœ ืคื•ื ืงืฆื™ื•ืช ืฉืืคืฉืจ "ืœื”ื“ื‘ื™ืง" ืขืœ ื›ืœ Struct, ื•ื›ืœ ืื•ืกืฃ ื›ื–ื” ื ืงืจื Trait. ืื– ื”ื ื” ื“ื•ื’ืžื” Struct ืจืืฉื•ืŸ ืžื™ื™ืฆื’ ืกืคืจ:
struct Book {
    title: String,
    author_name: String,
    cost: i32,
}
ืื ื™ ื™ื›ื•ืœ ืœื™ืฆื•ืจ ื›ืžื” ืกืคืจื™ื ื•ืœื”ื“ืคื™ืก ืžื”ื ืžื™ื“ืข:
struct Book {
    title: String,
    author_name: String,
    cost: i32,
}

fn main() {   
    let b1 = Book { title: "The Picture of Dorian Gray".to_string(), author_name: "Oscar Wilde".to_string(), cost: 0 };
    let b2 = Book { title: "Dracula".to_string(), author_name: "Mary Wollstonecraft Shelley".to_string(), cost: 0 };
    let b3 = Book { title: "Jane Eyre".to_string(), author_name: "Charlotte Brontรซ".to_string(), cost: 0 };

    println!("{} was written by {}", b1.title, b1.author_name);
}
ืืช ืคืงื•ื“ืช ื”ื”ื“ืคืกื” ืื ื™ ื™ื›ื•ืœ ืœื”ืขื‘ื™ืจ ืœืคื•ื ืงืฆื™ื” ืฉืœ ื”ืกื˜ืจืืงื˜, ื•ืื– ื”ืชื—ื‘ื™ืจ ื™ืจื’ื™ืฉ ืžืžืฉ ื›ืžื• ืชื›ื ื•ืช ืžื•ื ื—ื” ืขืฆืžื™ื:
struct Book {
    title: String,
    author_name: String,
    cost: i32,
}

impl Book {
    fn describe(&self) {
        println!("{} was written by {}. It costs {}$", self.title, self.author_name, self.cost);
    }
}

fn main() {
    let b1 = Book { title: "The Picture of Dorian Gray".to_string(), author_name: "Oscar Wilde".to_string(), cost: 0 };
    let b2 = Book { title: "Dracula".to_string(), author_name: "Mary Wollstonecraft Shelley".to_string(), cost: 0 };
    let b3 = Book { title: "Jane Eyre".to_string(), author_name: "Charlotte Brontรซ".to_string(), cost: 0 };

    b1.describe();
    b2.describe();
    b3.describe();
}
ืขื›ืฉื™ื• ื‘ื•ืื• ื ื‘ื ื” ืขื•ื“ Struct, ื ื ื™ื— ืขื‘ื•ืจ ืžื›ื•ื ื™ืช ืฆืขืฆื•ืข:
struct ToyCar {
    color: String,
    cost: i32,
}
ื•ื ืฉื™ื ืœื‘ ืฉืœืฉื ื™ ื”ืกื˜ืจืืงื˜ื™ื ืฉืœื ื• ื™ืฉ ืžืืคื™ื™ืŸ cost. ืื– ืืคืฉืจ ืœื›ืชื•ื‘ ืคื•ื ืงืฆื™ื” ืฉ"ืชืชืื™ื" ืœืฉื ื™ื”ื, ืœืžืฉืœ ื”ืคื•ื ืงืฆื™ื” sell ืฉืžื•ื›ืจืช ืืช ื”ื“ื‘ืจ. ืจืืกื˜ ืžืืคืฉืจ ื›ืชื™ื‘ ืžืงื•ืฆืจ ืขื‘ื•ืจ ืื•ืกืฃ ืฉืœ ืคื•ื ืงืฆื™ื•ืช ืฉืืคืฉืจ ืœื”ืคืขื™ืœ ืขืœ ืกื˜ืจืืงื˜ื™ื ื•ื–ื” ื ืงืจื Trait. ื ื›ืชื•ื‘ Trait ื‘ืฉื Sellable ืฉืžื’ื“ื™ืจ ืกื˜ืจืืงื˜ื™ื ืฉืืคืฉืจ ืœืžื›ื•ืจ ืื•ืชื. ื”ื•ื ื™ื•ืกื™ืฃ ืคื•ื ืงืฆื™ื” ื‘ืฉื sell ืฉืคืฉื•ื˜ ืชื“ืคื™ืก ืืช ื”ืžื—ื™ืจ:
trait Sellable {
    fn get_price(&self) -> i32;

    fn sell(&self) {
        println!("Got {}$", self.get_price());
    }
}
ื ื’ื“ื™ืจ ืฉ Book ื• ToyCar ืžืžืžืฉื™ื ืืช ื” Trait, ื•ื ื‘ื ื” ืœื›ืœ ืื—ื“ ืžื”ื ืืช ื”ืคื•ื ืงืฆื™ื” get_price ืฉืœื•:
impl Sellable for Book {
    fn get_price(&self) -> i32 {
        return self.cost;
    }
}

impl Sellable for ToyCar {
    fn get_price(&self) -> i32 {
        return self.cost;
    }
}
ืฉื™ืžื• ืœื‘ ืฉื‘ Trait ืื™ ืืคืฉืจ ืœื’ืฉืช ืœืฉื“ื•ืช ื”ืžื™ื“ืข ืฉืœ Struct, ืจืง ืœื”ืคืขื™ืœ ืคื•ื ืงืฆื™ื•ืช ืฉืœื•, ื•ืœื›ืŸ ื”ื™ื™ืชื™ ืฆืจื™ืš ืœื”ื’ื“ื™ืจ ืืช ื”ืคื•ื ืงืฆื™ื” get_price ืฉืจืง ืžื—ื–ื™ืจื” ืืช ืขืจืš ืฉื“ื” ื”ืžื™ื“ืข cost. ืื—ืจื™ ื›ืœ ื”ื‘ืœืื’ืŸ ืื ื™ ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ืคื•ื ืงืฆื™ื•ืช ื”ื—ื“ืฉื•ืช ืฉืœ Sellable ืขืœ ืกืคืจื™ื ืื• ืขืœ ืžื›ื•ื ื™ื•ืช ืฆืขืฆื•ืข:
book.sell();
car.sell();
ื•ื”ืชื•ื›ื ื™ืช ื”ืžืœืื”:
trait Sellable {
    fn get_price(&self) -> i32;

    fn sell(&self) {
        println!("Got {}$", self.get_price());
    }
}

impl Sellable for Book {
    fn get_price(&self) -> i32 {
        return self.cost;
    }
}

impl Sellable for ToyCar {
    fn get_price(&self) -> i32 {
        return self.cost;
    }    
}

struct ToyCar {
    color: String,
    cost: i32,
}

struct Book {
    title: String,
    author_name: String,

ToCode
1 420
ื‘ื ื•ืกืฃ ืื ื™ ืžืžืœื™ืฅ ืœื”ืฉืชืžืฉ ื‘ VS Code ื›ื“ื™ ืœืขืจื•ืš ืงื‘ืฆื™ rust ืžืงื•ืžื™ืช. ื™ืฉ ืชื•ืกืฃ ื‘ืฉื rust-analyzer ืฉืžืจืื” ืœื›ื ืžื” ื”ื˜ื™ืคื•ืก ืฉืœ ื›ืœ ืžืฉืชื ื” ื›ืฉืืชื ืขื•ืจื›ื™ื ืืช ื”ืงื•ื“, ื•ืžืฆื™ื’ ืฉื’ื™ืื•ืช ืงื•ืžืคื™ืœืฆื™ื” ืื ื™ืฉ ืžืžืฉ ืžืชื•ืš ื”ืขื•ืจืš. ืื—ืจื™ ื”ืชืงื ื” ื‘ืฉื‘ื™ืœ ืœืคืชื•ื— ืคืจื•ื™ืงื˜ ื—ื“ืฉ ื‘ืชื™ืงื™ื™ื” ื—ื“ืฉื” ื ื›ืชื•ื‘ ืžืฉื•ืจืช ื”ืคืงื•ื“ื”:
cargo new myapp
ื•ื–ื” ื™ื™ืฆื•ืจ ืชื™ืงื™ื” ื‘ืฉื myapp ื•ื‘ืชื•ื›ื” ืืช ื”ืงื‘ืฆื™ื:
.
โ”œโ”€โ”€ Cargo.lock
โ”œโ”€โ”€ Cargo.toml
โ”œโ”€โ”€ src
โ”‚   โ””โ”€โ”€ main.rs
ื‘ื™ืžื™ื ื”ื‘ืื™ื ื ืœืžื“ ืื™ืš ืœื”ืชืงื™ืŸ ืกืคืจื™ื•ืช ืขื–ืจ ื•ืื– ื ืจืื” ืœืžื” ื”ืงื•ื‘ืฅ Cargo.toml ื—ืฉื•ื‘. ื‘ื™ื ืชื™ื™ื ืชื•ื›ืœื• ืœืขื™ื™ืŸ ื‘ืงื•ื‘ืฅ main.rs ืฉื ื•ืฆืจ ื•ืœื”ืจื™ืฅ ืขื:
cargo run
## ืื™ืš ืจืืกื˜ ืžืชื™ื™ื—ืก ืœื–ื™ื›ืจื•ืŸ (ื›ื•ืœืœ ืžื” ื–ื” Box) ืื ื™ ืจื•ืฆื” ืœื”ืžืฉื™ืš ืœืขื•ื“ ื›ืžื” ื‘ื™ื˜ื™ื ืขืœ ื”ืฉืคื” ืฉื™ืขื–ืจื• ืœื›ื ืœื”ื‘ื™ืŸ ืืช ื”ืชื•ื›ื ื™ื•ืช ืฉื™ืชืคืจืกืžื• ื‘ืžื”ืœืš ื”ืฉื‘ื•ืข ื•ืœื”ืจื—ื™ื‘ ืื•ืชืŸ ื‘ืขืฆืžื›ื. ื ืงื•ื“ื” ืจืืฉื•ื ื” ื•ืžื™ื•ื—ื“ืช ื‘ืจืืกื˜ ื”ื™ื ื”ื™ื—ืก ืœื–ื™ื›ืจื•ืŸ. ื”ื’ื™ืฉื” ืฉืœ ืจืืกื˜ ืœื—ื™ื™ื ื”ื™ื ื“ื™ ื™ื™ื—ื•ื“ื™ืช ื‘ื ื•ืฃ ืฉืœ ืฉืคื•ืช ืชื›ื ื•ืช - ืžืฆื“ ืื—ื“ ืจืืกื˜ ืœื ื›ื•ืœืœืช Garbage Collector, ืื‘ืœ ืžืฆื“ ืฉื ื™ ื”ื–ื™ื›ืจื•ืŸ ืœื ืžื ื•ื”ืœ ืœื’ืžืจื™ ื™ื“ื ื™ืช. ื›ืœ ื”ืžืฉืชื ื™ื ืฉืจืื™ื ื• ืขื“ ืขื›ืฉื™ื• ื”ื—ื–ื™ืงื• ืžืกืคืจื™ื ืคืฉื•ื˜ื™ื, ื•ืœื›ืŸ ืจืืกื˜ ืฉืžืจ ืื•ืชื ืขืœ ื”ืžื—ืกื ื™ืช. ืžื™ื“ืข ืฉื ืฉืžืจ ืขืœ ื”ืžื—ืกื ื™ืช ืžื ื•ืงื” ืื•ื˜ื•ืžื˜ื™ืช ื›ืฉื™ื•ืฆืื™ื ืžื” Stack Frame, ื›ืœื•ืžืจ ื‘ื™ืฆื™ืื” ืžื”ืคื•ื ืงืฆื™ื” ืื• ื”ื‘ืœื•ืง ืฉื‘ื• ื”ื•ื ื”ื•ื’ื“ืจ. ืจืืกื˜ ืชื•ืžืš ื’ื ื‘ื”ืงืฆืืช ืžื™ื“ืข ืขืœ ื”"ืขืจื™ืžื”". ืžื™ื“ืข ืฉืžื•ืงืฆื” ืขืœ ื”ืขืจื™ืžื” ื”ื•ื ื›ื–ื” ืฉืืคืฉืจ ืœื”ืขื‘ื™ืจ ื‘ื™ืŸ ืคื•ื ืงืฆื™ื•ืช, ื›ื™ ื”ื•ื ืœื ื ืžื—ืง ืื•ื˜ื•ืžื˜ื™ืช ื‘ื™ืฆื™ืื” ืžื”ื‘ืœื•ืง. ื‘ืžืงื•ื ื–ื”, ืžื™ื“ืข ืฉื™ื•ืงืฆื” ืขืœ ื”ืขืจื™ืžื” ื™ืงื‘ืœ Owner, ืฉื–ื” ืžืฉืชื ื” ืžื™ื•ื—ื“ ืฉืื—ืจืื™ ืขืœ ื”ืžื™ื“ืข ื”ื–ื”. ืื ื” Owner ื™ื•ืฆื ืžื” Scope ื”ืžื™ื“ืข ื™ื™ืžื—ืง, ืื‘ืœ ื”ืจื‘ื” ืคืขื•ืœื•ืช ื‘ืจืืกื˜ ืžื—ืœื™ืคื•ืช owner ื•ื›ืš ืืคืฉืจ ืœืฉืžื•ืจ ืืช ื”ืžื™ื“ืข ืœืื•ืจืš ื–ืžืŸ. ืื ื™ ื—ื•ืฉื‘ ืฉื“ื•ื’ืžื” ืชืขื–ื•ืจ ื›ืืŸ. ืžื—ืจื•ื–ืช ื”ื™ื ื“ื•ื’ืžื” ืœืžืฉืชื ื” ืฉืžืงื‘ืœ ืžืงื•ื ืขืœ ื”ืขืจื™ืžื”, ื•ืœื›ืŸ ืืคืฉืจ ืœืขื“ื›ืŸ ืื•ืชื” ื•ืœื”ืขื‘ื™ืจ ืื•ืชื” ื‘ื™ืŸ ืคื•ื ืงืฆื™ื•ืช. ื ื ืกื” ืœื›ืชื•ื‘ ืงื•ื“ ืฉืขื•ื‘ื“ ืขื ืžื—ืจื•ื–ืช ื›ื“ื™ ืœืœืžื•ื“ ืขื•ื“ ืงืฆืช ืขืœ ื–ื™ื›ืจื•ืŸ ื•ื ื™ื”ื•ืœื• ื‘ Rust. ืชื•ื›ื ื™ืช ืจืืฉื•ื ื” ืคืฉื•ื˜ ื™ื•ืฆืจืช ืžื—ืจื•ื–ืช ื•ืžื“ืคื™ืกื” ืื•ืชื”:
fn main() {
    let name = String::from("hello");
    
    println!("got: {}", name);
}
ืขื“ ื›ืืŸ ืœื ืงืจื” ื”ืจื‘ื”. ืขื›ืฉื™ื• ื ื ืกื” ืœื”ืขื‘ื™ืจ ืืช ื”ื”ื“ืคืกื” ืœืคื•ื ืงืฆื™ื” ืื—ืจืช:
fn print_name(name: String) {
    println!("{}", name);
}

fn main() {
    let name = String::from("hello");
    print_name(name);
}
ืื ื—ื ื• ืขื“ื™ื™ืŸ ื‘ืกื“ืจ. ื”ืชื•ื›ื ื™ืช ืžืชืงืžืคืœืช ื•ืจืฆื”. ืขื›ืฉื™ื• ื ื•ืกื™ืฃ ืขื•ื“ ื›ืžื” ืงืจื™ืื•ืช ืœืคื•ื ืงืฆื™ื™ืช ื”ื”ื“ืคืกื” ื›ื“ื™ ืœืฉื‘ื•ืจ ืืช ื”ืงื•ื“:
fn print_name(name: String) {
    println!("{}", name);
}

fn main() {   
    let name = String::from("hello");
    
    print_name(name);
    print_name(name);
    print_name(name);
}
ื•-ื”ืชื•ื›ื ื™ืช ื›ื‘ืจ ืœื ืžืชืงืžืคืœืช. ื”ืฉื’ื™ืื” ืžื•ืคื™ืขื” ื‘ืงืจื™ืื” ื”ืฉื ื™ื” ืœืคื•ื ืงืฆื™ื™ืช ื”ื”ื“ืคืกื”:
use of moved value: `name`
ื–ืืช ืื—ืช ื”ืฉื’ื™ืื•ืช ื”ืจืืฉื•ื ื•ืช ืฉืงื™ื‘ืœืชื™ ื‘ Rust ื•ืื—ืช ื”ื ืคื•ืฆื•ืช. ืžื” ืฉืจืืกื˜ ืื•ืžืจ ืœื™ ื›ืืŸ ื–ื” ืฉืœื›ืœ String ื‘ืชื•ื›ื ื™ืช ื™ืฉ Owner, ืฉื–ื” ื”ืžืฉืชื ื” ืฉ"ืฉื•ืžืจ" ืขืœื™ื”. ื›ืฉื”ืžืฉืชื ื” ื”ื–ื” ื™ื•ืฆื ืž Scope ื”ืžื—ืจื•ื–ืช ืชื™ืžื—ืง. ื›ืฉื”ืชื•ื›ื ื™ืช ืžืชื—ื™ืœื” ื” Owner ื”ื•ื ื”ืžืฉืชื ื” name, ืื‘ืœ ื›ืฉืื ื™ ืžืขื‘ื™ืจ ืืช name ืœืคื•ื ืงืฆื™ื” print_name ืฉื™ื ื™ืชื™ ื’ื ื‘ืขืœื•ืช, ื•ืขื›ืฉื™ื• ื”ืคื•ื ืงืฆื™ื” "ื”ืฉืชืœื˜ื”" ืขืœ ื”ืžื™ื“ืข. ื ื™ืกื™ื•ืŸ ืœืขื‘ื•ื“ ืขื ื”ืžืฉืชื ื” ืื—ืจื™ ืฉื ืชืชื™ ืื•ืชื• ืœืคื•ื ืงืฆื™ื” ื™ื™ื›ืฉืœ, ื›ื™ ื”ืžืฉืชื ื” ื”ื•ื ื›ื‘ืจ ืœื ื”"ื‘ืขืœื™ื" ืฉืœ ื”ืžื™ื“ืข, ื•ืื•ืœื™ ื”ืžื™ื“ืข ื›ื‘ืจ ืœื ื‘ืชื•ืงืฃ. ืจืืกื˜ ืžื ืกื” ืœืฉืžื•ืจ ืขืœื™ื™ ืžื˜ืขื•ื™ื•ืช ืฉืœ ื’ื™ืฉื” ืœืžื™ื“ืข ืื—ืจื™ ืฉืžื—ืงืชื™ ืื•ืชื•. ื‘ืฉื‘ื™ืœ ืœื”ืฆืœื™ื— ืœื”ืขื‘ื™ืจ ืžืฉืชื ื” ืœืคื•ื ืงืฆื™ื” ื‘ืœื™ ืฉื”ืคื•ื ืงืฆื™ื” ืชื™ืงื— "ื‘ืขืœื•ืช" ืขืœ ื”ืžื™ื“ืข, ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœื”ืขื‘ื™ืจ Reference ืœืžืฉืชื ื”. ื–ื” ื ืจืื” ื›ื›ื”:
fn print_name(name: &String) {
    println!("{}", name);
}

fn main() {   
    let name = String::from("hello");
    
    print_name(&name);
    print_name(&name);
    print_name(&name);

    println!("My name is still {}", name);
}
ื”ื”ื‘ื“ืœ ื”ื•ื ื”ืืคืฉืจื•ืช ืฉืœ ืจืืกื˜ ืœื‘ืฆืข ื‘ื“ื™ืงืช ื˜ื™ืคื•ืกื™ื - ืฉื™ืžื• ืœื‘ ืžื” ืงื•ืจื” ืื ืื ื™ ืžื ืกื” ืœืฉื ื•ืช ืืช ื”ืžื—ืจื•ื–ืช ืžืชื•ืš ื”ืคื•ื ืงืฆื™ื”:
fn print_name(name: &String) {
    name.push_str("yay");
}
ื”ืงื•ื“ ื”ื–ื” ืžื ืกื” ืœื”ื•ืกื™ืฃ ืืช ื”ืกื™ื•ืžืช yay ืœืžื—ืจื•ื–ืช, ืื‘ืœ ื”ื•ื ืœื ืžืชืงืžืคืœ. ื”ืžื—ืจื•ื–ืช ื ื›ื ืกื” ืœืคื•ื ืงืฆื™ื” ื‘ืชื•ืจ Reference ื•ืœื›ืŸ ืื™ืŸ ืœืคื•ื ืงืฆื™ื” ื”ืจืฉืื” ืœืฉื ื•ืช ืื•ืชื”. ืจื’ืข, ื•ืžื” ืื ืื ื—ื ื• ื›ืŸ ืจื•ืฆื™ื ืœื”ืขื‘ื™ืจ ื’ื™ืจืกื” ื ื™ืชื ืช ืœืฉื™ื ื•ื™ ืฉืœ ื”ืžื—ืจื•ื–ืช ืœืคื•ื ืงืฆื™ื”, ื•ืขื“ื™ื™ืŸ ื‘ืœื™ ืœื”ืขื‘ื™ืจ ื‘ืขืœื•ืช? ื’ื ืืช ื–ื” ืืคืฉืจ, ืื‘ืœ ื–ื” ื“ื•ืจืฉ ืงืฆืช ื™ื•ืชืจ ืชื•ื•ื™ื. ื”ื ื” ื”ืงื•ื“:
fn print_name(name: &String) {
    println!("{}", name)
}

fn change_name(name: &mut String) {
    name.push_str("--- the end; ");
}

fn main() {