Enum std::ops::ControlFlow1.55.0[][src]

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

用于告诉操作是应该提前退出还是像往常一样继续操作。

在将您希望用户能够选择是否提前退出的事物 (例如图形遍历或访问者) 公开时使用。 有了枚举可以使它更清晰 - 不必再奇怪 “wait, what did false mean again?” 了 - 并允许包含一个值。

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

Examples

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));
Run

一个基本的树遍历:

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);
Run

Variants

Continue(C)

照常进行下一阶段的操作。

Tuple Fields of Continue

0: C
Break(B)

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

Tuple Fields of Break

0: B

Implementations

🔬 This is a nightly-only experimental API. (control_flow_enum #75744)

new API

如果这是 Break 变体,则返回 true

Examples
#![feature(control_flow_enum)]
use std::ops::ControlFlow;

assert!(ControlFlow::<i32, String>::Break(3).is_break());
assert!(!ControlFlow::<String, i32>::Continue(3).is_break());
Run
🔬 This is a nightly-only experimental API. (control_flow_enum #75744)

new API

如果这是 Continue 变体,则返回 true

Examples
#![feature(control_flow_enum)]
use std::ops::ControlFlow;

assert!(!ControlFlow::<i32, String>::Break(3).is_continue());
assert!(ControlFlow::<String, i32>::Continue(3).is_continue());
Run
🔬 This is a nightly-only experimental API. (control_flow_enum #75744)

new API

如果 ControlFlowBreak,则将 ControlFlow 转换为 Some,否则为 None

Examples
#![feature(control_flow_enum)]
use std::ops::ControlFlow;

assert_eq!(ControlFlow::<i32, String>::Break(3).break_value(), Some(3));
assert_eq!(ControlFlow::<String, i32>::Continue(3).break_value(), None);
Run
🔬 This is a nightly-only experimental API. (control_flow_enum #75744)

new API

Maps ControlFlow<B, C>ControlFlow<T, C> 通过在中断值 (如果存在) 上应用函数来实现。

🔬 This is a nightly-only experimental API. (control_flow_enum #75744)

new API

通常,Continue 不需要任何值,因此,如果愿意,这提供了一种避免输入 (()) 的方法。

Examples
#![feature(control_flow_enum)]
use std::ops::ControlFlow;

let mut partial_sum = 0;
let last_used = (1..10).chain(20..25).try_for_each(|x| {
    partial_sum += x;
    if partial_sum > 100 { ControlFlow::Break(x) }
    else { ControlFlow::CONTINUE }
});
assert_eq!(last_used.break_value(), Some(22));
Run
🔬 This is a nightly-only experimental API. (control_flow_enum #75744)

new API

try_for_each 这样的 API 不需要 Break 的值,因此,如果您愿意的话,这提供了一种避免输入 (()) 的方法。

Examples
#![feature(control_flow_enum)]
use std::ops::ControlFlow;

let mut partial_sum = 0;
(1..10).chain(20..25).try_for_each(|x| {
    if partial_sum > 100 { ControlFlow::BREAK }
    else { partial_sum += x; ControlFlow::CONTINUE }
});
assert_eq!(partial_sum, 108);
Run

Trait Implementations

返回值的副本。 Read more

source 执行复制分配。 Read more

使用给定的格式化程序格式化该值。 Read more

🔬 This is a nightly-only experimental API. (try_trait_v2 #84277)

从兼容的 Residual 类型构造类型。 Read more

此方法测试 selfother 值是否相等,并由 == 使用。 Read more

此方法测试 !=

🔬 This is a nightly-only experimental API. (try_trait_v2 #84277)

当不短路时,? 产生的值的类型。

🔬 This is a nightly-only experimental API. (try_trait_v2 #84277)

短路时作为 ? 的一部分传递给 FromResidual::from_residual 的值的类型。 Read more

🔬 This is a nightly-only experimental API. (try_trait_v2 #84277)

从它的 Output 类型构造类型。 Read more

🔬 This is a nightly-only experimental API. (try_trait_v2 #84277)

? 来决定操作符是应该生成一个值 (因为它返回了 ControlFlow::Continue),还是将一个值传播回调用者 (因为它返回了 ControlFlow::Break)。 Read more

Auto Trait Implementations

Blanket Implementations

获取 selfTypeIdRead more

从拥有的值中一成不变地借用。 Read more

从拥有的值中借用。 Read more

执行转换。

执行转换。

获得所有权后的结果类型。

从借用的数据创建拥有的数据,通常是通过克隆。 Read more

🔬 This is a nightly-only experimental API. (toowned_clone_into #41263)

recently added

使用借来的数据来替换拥有的数据,通常是通过克隆。 Read more

发生转换错误时返回的类型。

执行转换。

发生转换错误时返回的类型。

执行转换。