#[derive(Debug)]
struct Hoge {
id: usize,
ok: bool,
}
impl Drop for Hoge {
fn drop(&mut self) {
assert!(self.
ok, "must call .ok() (id: {})", self.
id); }
}
impl Hoge {
fn new(id: usize) -> Self {
Self{ id, ok: false }
}
fn next(mut self, check: i32) -> Result<Self,()> {
self.ok = true;
if check < 10 {
Ok(Self{id: self.id, ok: false})
} else {
Err(())
}
}
fn ok(mut self, check: i32) -> Result<(),()> {
self.ok = true;
if check < 10 {
Ok(())
} else {
Err(())
}
}
}
fn main() {
run().unwrap();
}
fn run() -> Result<(),()> {
let h0 = Hoge::new(0);
let h1 = Hoge::new(1);
let h2 = Hoge::new(3);
let h3 = Hoge::new(4);
h0.next(3)?;
h1.next(4)?.next(9)?.ok(3)?;
h2.next(10)?.next(4)?.ok(3)?;
h3.ok(4)?;
Ok(())
}
CiNbZGVyaXZlKERlYnVnKV0Kc3RydWN0IEhvZ2UgewogICAgaWQ6IHVzaXplLAogICAgb2s6IGJvb2wsCn0KCmltcGwgRHJvcCBmb3IgSG9nZSB7CiAgICBmbiBkcm9wKCZtdXQgc2VsZikgewogICAgICAgIGFzc2VydCEoc2VsZi5vaywgIm11c3QgY2FsbCAub2soKSAoaWQ6IHt9KSIsIHNlbGYuaWQpOwogICAgfQp9CgppbXBsIEhvZ2UgewogICAgZm4gbmV3KGlkOiB1c2l6ZSkgLT4gU2VsZiB7CiAgICAgICAgU2VsZnsgaWQsIG9rOiBmYWxzZSB9CiAgICB9CiAgICBmbiBuZXh0KG11dCBzZWxmLCBjaGVjazogaTMyKSAtPiBSZXN1bHQ8U2VsZiwoKT4gewogICAgICAgIHNlbGYub2sgPSB0cnVlOwogICAgICAgIGlmIGNoZWNrIDwgMTAgewogICAgICAgICAgICBPayhTZWxme2lkOiBzZWxmLmlkLCBvazogZmFsc2V9KQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIEVycigoKSkKICAgICAgICB9CiAgICB9CiAgICBmbiBvayhtdXQgc2VsZiwgY2hlY2s6IGkzMikgLT4gUmVzdWx0PCgpLCgpPiB7CiAgICAgICAgc2VsZi5vayA9IHRydWU7CiAgICAgICAgaWYgY2hlY2sgPCAxMCB7CiAgICAgICAgICAgIE9rKCgpKQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIEVycigoKSkKICAgICAgICB9CiAgICB9Cn0KCmZuIG1haW4oKSB7CiAgICBydW4oKS51bndyYXAoKTsKfQoKZm4gcnVuKCkgLT4gUmVzdWx0PCgpLCgpPiB7CiAgICBsZXQgaDAgPSBIb2dlOjpuZXcoMCk7CiAgICBsZXQgaDEgPSBIb2dlOjpuZXcoMSk7CiAgICBsZXQgaDIgPSBIb2dlOjpuZXcoMyk7CiAgICBsZXQgaDMgPSBIb2dlOjpuZXcoNCk7CiAgICAKICAgIGgwLm5leHQoMyk/OwogICAgaDEubmV4dCg0KT8ubmV4dCg5KT8ub2soMyk/OwogICAgaDIubmV4dCgxMCk/Lm5leHQoNCk/Lm9rKDMpPzsKICAgIGgzLm9rKDQpPzsKICAgIAogICAgT2soKCkpCiAgICAKfQ==