#![feature(try_trait_v2)]
#![allow(unused)]
use std::ops::{ControlFlow, FromResidual, Try};
#[derive(Debug)]
enum MyTry {
TOK(Vec<String>),
TERR(Vec<String>),
}
impl FromResidual for MyTry {
/// from的目的是复原对象
fn from_residual(residual: <Self as Try>::Residual) -> Self {
println!("调用 from_residual: {residual:?}");
let mut residual = residual;
residual.push("调用 from_residual".to_string());
MyTry::TERR(residual)
}
}
impl Try for MyTry {
type Output = Vec<String>;
type Residual = Vec<String>;
/// from的目的是复原对象
fn from_output(output: Self::Output) -> Self {
println!("调用 from output: {output:?}");
let mut output = output;
output.push("调用 from_output".to_string());
MyTry::TOK(output)
}
/// 在执行到?时, 调用branch来判断是继续还是返回
/// 继续时, 类型为 Self::Output,
/// 返回时, 类型为 Self,
fn branch(self) -> ControlFlow<Self::Residual, Self::Output> {
match self {
MyTry::TOK(ok) => {
println!("branch ok");
let mut ok= ok;
ok.push("被分支ok修改".to_string());
ControlFlow::Continue(ok)
}
MyTry::TERR(err) => {
println!("branch err");
let mut err = err;
err.push("被分支err修改".to_string());
ControlFlow::Break(err)
}
}
}
}
fn try1() -> MyTry {
let r1 = MyTry::TOK(vec!["初始化的数据".to_string()])?;
println!("r1 is {:?}", r1);
MyTry::TOK(r1)
}
fn try2() -> MyTry {
let r2 = MyTry::TERR(vec!["初始化的数据".to_string()])?;
println!("r2 is {:?}", r2);
MyTry::TOK(r2)
}
fn main() {
let rs = try1();
println!("rs: {:?}", rs);
let rs2 = try2();
println!("rs2: {rs2:?}");
}