時計をアプリを作成する
思い付きで時計アプリを作成しようと思い立ったのでその際に調べたことを書いていく。
今回のdependencies
今回のライブラリクレートこちら
[dependencies]
termion = "*"
chrono = "0.4"
一つ目はtermionというライブラリクレート。
ターミナルを操作するのに使っている。
https://github.com/redox-os/termion
この時計アプリでは画面をクリアして、カーソルを座標(1,1)にセットしている。
eprint!("{}{}", termion::clear::All, termion::cursor::Goto(1, 2));
二つ目のchronoは現在時刻を扱うために使用している。
https://docs.rs/chrono/0.4.19/chrono/
全体的なつくりついて
はじめに可変長のint型とstring型の変数を3つずつ定義する。
let mut hour = 0;
let mut min = 0;
let mut sec = 0;
let mut hour_str;
let mut min_str;
let mut sec_str;
loopに画面初期化とカーソル(1,1)移動させる。
loop {
eprint!("{}{}", termion::clear::All, termion::cursor::Goto(1, 2));
10より小さい場合は0をつけて、そうでなければそのまま出力するようにする。(時、分、秒共通)
// hour translate
if hour < 10 {
hour_str = format!("{}{}", "0", hour);
} else {
hour_str = format!("{}", hour);
}
// minute translate
if min < 10 {
min_str = format!("{}{}", "0", min);
} else {
min_str = format!("{}", min);
}
// second translate
if sec < 10 {
sec_str = format!("{}{}", "0", sec);
} else {
sec_str = format!("{}", sec);
}
format!マクロで文字列をひとまとめにeprint!マクロで出力。(なぜeprint!マクロを使うのかというとprint!マクロではなぜか文字列が出力されないため。)
let display_clock = format!("{}:{}:{}",hour_str, min_str, sec_str);
eprint!("{}", display_clock);
secに+1して、secが60ならminを+1してsecをリセット、minが60ならhourを+1してminをリセットする。
(余談だがRustにはsec++mのようなインクリメント演算子は存在しない)
そして1秒間sleepする。
sec += 1;
// time calculate
if sec == 60 {
sec = 0;
min += 1;
}
if min == 60 {
min = 0;
hour += 1;
}
thread::sleep(Duration::from_secs(1));
こんな感じでいい感じに時間が表示される。
今後つけたいもの
- 現在時刻を取得して表示させたい。
- 2進数でドット絵を作成して表示させたい。
余談
Cargo.tomlを下記のようにcargo runで別々のモジュールを実行できる。
[[bin]]
name = "main"
path = "src/main.rs"
[[bin]]
name = "test"
path = "src/test.rs"
これで
cargo run --bin main
と実行すればsrc/main.rsを実行できる。