Enum core::ops::ControlFlow 1.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
照常进行操作的下一个阶段。
退出操作而不运行后续阶段。
Implementations
🔬 This is a nightly-only experimental API. (control_flow_enum
#75744)
new API
🔬 This is a nightly-only experimental API. (control_flow_enum
#75744)
new API
🔬 This is a nightly-only experimental API. (control_flow_enum
#75744)
new API
🔬 This is a nightly-only experimental API. (control_flow_enum
#75744)
new API
🔬 This is a nightly-only experimental API. (control_flow_enum
#75744)
new API
🔬 This is a nightly-only experimental API. (control_flow_enum
#75744)
new API
🔬 This is a nightly-only experimental API. (control_flow_enum
#75744)
new API
🔬 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
🔬 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
🔬 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
此方法测试 self
和 other
值是否相等,并由 ==
使用。 Read more
此方法测试 !=
。
type Residual = ControlFlow<B, Infallible>
type Residual = ControlFlow<B, Infallible>
短路时作为 ?
的一部分传递给 FromResidual::from_residual
的值的类型。 Read more
在 ?
来决定操作符是应该生成一个值 (因为它返回了 ControlFlow::Continue
),还是将一个值传播回调用者(因为它返回了 ControlFlow::Break
)。 Read more