ToCode
Kanalga Telegramโda oโtish
ืืืคืื ืงืฆืจืื ืืืชืื ืชืื ืืืช ืื ืื ืคืจืง
Ko'proq ko'rsatish1 420
Obunachilar
Ma'lumot yo'q24 soatlar
+27 kunlar
-230 kunlar
Postlar arxiv
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
}
## ืขืืืื ืืจืงืข ื Cursive1 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 ืืืฉืืง ืื ืืฉ.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;
}1 420
4. ืืคืงืืื
io::copy ืฉื ืจืืกื ืืงืืืช Reader ื Writer, ืืืขืชืืงื ืืช ืื ืืชืืื ืฉื ื Reader ื Writer. ืืคืฉืจ ืืงืจืื ืขืืื ืืชืืขืื ืืื https://doc.rust-lang.org/std/io/fn.copy.html. ืืืืืคื ืืช ืงืื ืืงืจืืื ืืืืชืืื ืืงืจืืื ื copy, ืืื ืฉืืืขืจืืช ืชืขืืื ืื ืขื ืงืื ืฉืื ืืืื ืชืืื ืืจืืืืช ืฉืืจื.
ืืืืื ืื ืืืืืืง ืืช ืืคืืชืจืื ืืช ืื ืฉืืืืช ืื ืืฉ ืืื ืืื ืืชืืืืืช, ืืื ืื ื ื ืืฉืื ืืืจ ืืืชืื ืืฉืืง ืงืฆืจ ื Rust.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 - ืฉืืจื ืืงืืืจ ืฉื ืื ืืืงืืืืช ืฉืืจืืข ืืืืืจืื, ืืื ืคืขื ืฉืืืฉืื ืฉืืื ืืืืขื ืฉืืื ืืช ืืืืืขื ืืืืช ืืื ืืืงืืืืช ืืืืจืื.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 ืืชืืืื ืขื ืืืฆืืข ืืฉืืืืช ืืืงืืื ืืขืืืื ืืจืฉืช. ืืื ืชืืื ืื ืคืชืจืชื ืืืง ืืชืจืืืื ืืืจืืื ืืืืื ืื ืืืืืืง ืืช ืืงืื ืืื ืืชืืืืืช.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);
}
ืืขื ืฉืืจืืช ืขื ืืจืื ืชืืื: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 ืฉืืืคืฉืจืช ืืืคื ืืฆืืจื ืืืืจื ืืื ืืืคืฉืจืืืืช ืืคืืขื ืื ืงืื ืืฉืืจืช ืืคืงืืื. ืขื ืื ืืืืื ืื ืืืืืืง ืืช ืืคืืชืจืื ืืช ืฉืืื ืืื ืืชืืืืืช.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.
## ืืฆืืจืช ื reader1 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 ืืื ืชื ืืืืจืืืช ืื ืืืืคืก ืืชื ืืืงืืจื ืืืชื ืืืจื ืืืืคื. ืืคืฉืจ ืืงืจืื ืขื ืขืืืื ืขื ืืฉืชื ื ืกืืืื ืืจืืกื ืืกืคืจ.
ืืืืื ืื ืืืืืืง ืคื ืืชืืืืืช ืืช ืืคืืชืจืื ืืช ืฉืืื ืืชืจืืืื ืืืจืืื, ืืื ืื ื ื ืืฉืื ืืืจ ืขื ืชืืื ืืช ืจืืกื ื ืืกืคืช.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 {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? ืื ืืงืจื ืื ื ืืืชืจ ืขืืื?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,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() {
Endi mavjud! Telegram Tadqiqoti 2025 โ yilning asosiy insaytlari 
