#![feature(try_trait_v2)]
use std::fmt::Debug;
use std::ops::{ControlFlow, FromResidual, Try};
fn main()
{
let rr1 = run1();
println!("run1结果: {:?}", rr1);
}
fn run1() -> MyResult
{
let ok = MyResult::MyOk(1123)?;
println!("ok输出为: {:?}", ok);
let err = MyResult::MyErr("错误".into())?;
println!("err输出为: {:?}", err);
MyResult::MyOk(9912)
}
#[derive(Debug)]
enum MyResult
{
MyOk(i32),
MyErr(String),
}
impl FromResidual for MyResult {
fn from_residual(residual: <Self as Try>::Residual) -> Self {
println!("from_residual参数: {:?}", residual);
MyResult::MyErr(residual)
}
}
impl Try for MyResult {
type Output = Result<i32, String>;
type Residual = String;
fn from_output(output: Self::Output) -> Self {
println!("from_output, output:{output:?}");
match output {
Ok(ok) => {
println!("from_output<UNK>: {:?}", ok);
MyResult::MyOk(ok)
}
Err(err) => {
println!("from_output<Err>: {:?}", err);
MyResult::MyErr(err)
}
}
}
fn branch(self) -> ControlFlow<Self::Residual, Self::Output> {
println!("分支执行 branch: {:?}", self);
match self {
MyResult::MyOk(output) => {
println!("MyResult::MyOk({:?})", output);
ControlFlow::Continue(Ok(output))
},
MyResult::MyErr(e) => {
println!("MyResult::MyErr({e:?})");
ControlFlow::Break(e)
},
}
}
}
/*
OUTPUT:
分支执行 branch: MyOk(1123)
MyResult::MyOk(1123)
ok输出为: Ok(1123)
分支执行 branch: MyErr("错误")
MyResult::MyErr("错误")
from_residual参数: "错误"
run1结果: MyErr("错误")
*/