とにかく書く

日々の雑感や知り得たことを、とにかく書いています

おっさんの挑戦(画像ビューア作成) 002

おっさんは頭の回転が鈍い。だから、経験に基づいて複雑なことを一般化して考えないと、頭がついていかない。そして、ミスなく指示してもらえないと、すぐ忘れる


雨の日。おっさんはいつもの黒いジャンプ傘をさして仕事に出かける。
連日の疲れが取れず、コーヒーでも買おうかとコンビニに立ち寄り、出てくるとまだ雨が降っている。
あやうく傘を忘れるところだったと思い出し、乱雑に突っ込まれたおっさんどもの傘から自分の傘を抜き出す。

仕事を終えて帰ろうとすると、まだ雨。
疲れた体に容赦なく降る雨。
傘立てから傘を抜き、戦場をあとにする。

帰路の途中には赤提灯。おっさんにも休息の時間を与えてあげてください。
すでに先客の傘が、日頃の鬱憤を晴らすように、傘立てに放射状に突き刺さっている。
おっさんも負けじとブスリとやる。
今日も一日頑張った。ほっと一息。一杯引っ掛けて帰ろう。

おっさんの心を代弁するかのように、雨はやみ、静かな夜が心地よく訪れる。
家に着いたら、また明日に向けて頑張ろう。
気力を補充し、今日も一日生き延びた充足感を胸に帰宅。

雨が降っていないと、傘忘れるよね。
きちんと毎回言ってくれないと、忘れるよね。

Rust の構造体でも、必要なメソッドを指示しておいてもらわないと、実装を忘れる。
そんなおっさんのためにトレイトがある。
関数宣言で、ジェネリック型の引数を取ったとしても、トレイト境界を定義しておけば、特定のメソッドを持つ型しか引数に取っちゃダメよ、と指示してもらえる。
そんなメソッド名の羅列がトレイト。

もうひとつライフタイム注釈について。
ライフタイム注釈は、コンパイラに変数の寿命を伝えるためだけの記法だって!
いままでコンパイラに伝えるためだけの記述が必要な言語があったでしょうか!?
処理以外に記述が必要だなんて、信じられない。

コンパイラソースコード機械語に変換するだけの役割だったのが、Rust では、動的なふるまいのチェックまで担ってる。
動かしたときのクラッシュ(ほら、例の青い画面)が起きないかを、コンパイル時点でちゃんとチェックしてくれてる。
これなら、おっさんもヌルポを発生させずに安心だね!

use iced::{
    button, executor, Application, Button, Column, Command, Element, Length, Settings, Text,
};

fn main() {
    Counter::run(Settings {
        ..Settings::default()
    })
}

// State - the state of my application
struct Counter {
    // The counter value
    value: i32,
    // The local state of the one buttons
    increment_button: button::State,
}

// Message - event that we care about
#[derive(Debug, Clone, Copy)] // derive Debug, Clone, Copy trait
pub enum Message {
    IncrementPressed,
}

impl Application for Counter {
    // Use default
    type Executor = executor::Default;
    type Message = Message;
    type Flags = ();

    fn new(_flags: ()) -> (Self, Command<Message>) {
        (
            Counter {
                value: 0,
                increment_button: button::State::new(),
            },
            Command::none(),
        )
    }

    fn title(&self) -> String {
        self.value.to_string()
    }

    // Update logic: connect events to functions
    fn update(&mut self, message: Message) -> Command<Message> {
        match message {
            Message::IncrementPressed => {
                self.value += 1;
            }
        }
        Command::none()
    }

    // View Logic
    fn view(&mut self) -> Element<Message> {
        // Use a column: a simple vertical layout
        Column::new()
            .push(
                // The increment button.
                // The event IncrementPressed is launched when it is pressed
                Button::new(&mut self.increment_button, Text::new("+"))
                    .on_press(Message::IncrementPressed),
            )
            .push(
                // The message
                Text::new(self.value.to_string()).size(50),
            )
            .width(Length::Units(100))
            .max_height(1000)
            .into()
    }
}