當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Rust ControlFlow用法及代碼示例


本文簡要介紹rust語言中 Enum core::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 core::ops::ControlFlow。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。