当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Rust ControlFlow用法及代码示例


本文简要介绍rust语言中 Enum std::ops::ControlFlow 的用法。

用法

pub enum ControlFlow<B, C = ()> {
    Continue(C),
    Break(B),
}

用于告诉操作是应该提前退出还是照常继续。

这用于公开您希望用户能够选择是否提前退出的事物(如图形遍历或访问者)。有了枚举就更清楚了——不用再想“等等,false 又是什么意思?” - 并允许包含一个值。

Option Result 类似,此枚举可与 ? 运算符一起使用,以在存在 Break 变体时立即返回,或者以其他方式正常继续使用 Continue 变体中的值。

例子

Early-exiting 来自 Iterator::try_for_each

use std::ops::ControlFlow;

let r = (2..100).try_for_each(|x| {
    if 403 % x == 0 {
        return ControlFlow::Break(x)
    }

    ControlFlow::Continue(())
});
assert_eq!(r, ControlFlow::Break(13));

一个基本的树遍历:

use std::ops::ControlFlow;

pub struct TreeNode<T> {
    value: T,
    left: Option<Box<TreeNode<T>>>,
    right: Option<Box<TreeNode<T>>>,
}

impl<T> TreeNode<T> {
    pub fn traverse_inorder<B>(&self, f: &mut impl FnMut(&T) -> ControlFlow<B>) -> ControlFlow<B> {
        if let Some(left) = &self.left {
            left.traverse_inorder(f)?;
        }
        f(&self.value)?;
        if let Some(right) = &self.right {
            right.traverse_inorder(f)?;
        }
        ControlFlow::Continue(())
    }
    fn leaf(value: T) -> Option<Box<TreeNode<T>>> {
        Some(Box::new(Self { value, left: None, right: None }))
    }
}

let node = TreeNode {
    value: 0,
    left: TreeNode::leaf(1),
    right: Some(Box::new(TreeNode {
        value: -1,
        left: TreeNode::leaf(5),
        right: TreeNode::leaf(2),
    }))
};
let mut sum = 0;

let res = node.traverse_inorder(&mut |val| {
    if *val < 0 {
        ControlFlow::Break(*val)
    } else {
        sum += *val;
        ControlFlow::Continue(())
    }
});
assert_eq!(res, ControlFlow::Break(-1));
assert_eq!(sum, 6);

变体

Continue(C)

元组字段

0: C

像往常一样进入下一阶段的操作。

Break(B)

元组字段

0: B

退出操作而不运行后续阶段。

相关用法


注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Enum std::ops::ControlFlow。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。