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

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

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

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

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, mut f: impl FnMut(&T) -> ControlFlow<B>) -> ControlFlow<B> {
        if let Some(left) = &self.left {
            left.traverse_inorder(&mut f)?;
        }
        f(&self.value)?;
        if let Some(right) = &self.right {
            right.traverse_inorder(&mut f)?;
        }
        ControlFlow::Continue(())
    }
}
Run

Variants

Continue(C)

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

Break(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

执行转换。

执行转换。

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

执行转换。

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

执行转换。