Open3
Typesafe State in Rust (preview)
誤字脱字、表記揺れ、おもしろネタがあれば教えてください
Chapter 06 で意図したものかは分かりませんが、 sealed trait はパターンとして存在します。
- https://rust-lang.github.io/api-guidelines/future-proofing.html#c-sealed
- 非公式日本語訳: https://sinkuu.github.io/api-guidelines/future-proofing.html#sealedトレイトを使って下流の実装を適切に防いでいる-c-sealed
Chapter 05 ですが、 Model<T>
とせず↓のようにするのはどうでしょうか?
Chapter 06 で必要とする場面で Model
を enum 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();
}
ありがとうございます!
まさかSealed Traitがパターン網羅と別の意味であったなんて!ちょっと文章書き換えます。
Model<T>
を使わないの良さそうですね。Chapter 05、06ではたしかにこちらの方がスマートそうです。
ちょっと今のModel<T>
、Union
とのpros、consを考えて章構成をいじってみたいと思います。