Open3

Typesafe State in Rust (preview)

bouzuyabouzuya

Chapter 06 で意図したものかは分かりませんが、 sealed trait はパターンとして存在します。


Chapter 05 ですが、 Model<T> とせず↓のようにするのはどうでしょうか?

Chapter 06 で必要とする場面で Modelenum Model {...} として追加すればまとめることもパターンマッチも可能そうです。

use std::time::SystemTime;

struct Initialized {
    created_at: SystemTime,
}
struct Opened {
    created_at: SystemTime,
    opened_at: SystemTime,
}
struct Closed {
    created_at: SystemTime,
    opened_at: SystemTime,
    closed_at: SystemTime,
}
// enum Model {
//     Initialized(Initialized),
//     Opened(Opened),
//     Closed(Closed),
// }

impl Initialized {
    pub fn new() -> Initialized {
        Initialized {
            created_at: SystemTime::now(),
        }
    }

    pub fn open(self) -> Opened {
        Opened {
            created_at: self.created_at,
            opened_at: SystemTime::now(),
        }
    }
}
impl Opened {
    pub fn close(self) -> Closed {
        Closed {
            created_at: self.created_at,
            opened_at: self.opened_at,
            closed_at: SystemTime::now(),
        }
    }
}

#[test]
fn main() {
    let initialized_model = Initialized::new();
    let opened_model = initialized_model.open();
    let closed_model = opened_model.close();
}

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=65d70d56933c19f262636ee6db8645ae

kk

ありがとうございます!

まさかSealed Traitがパターン網羅と別の意味であったなんて!ちょっと文章書き換えます。

Model<T>を使わないの良さそうですね。Chapter 05、06ではたしかにこちらの方がスマートそうです。
ちょっと今のModel<T>Unionとのpros、consを考えて章構成をいじってみたいと思います。