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?” 了 - 并允许包含一个值。
与 Option
和 Result
类似,此枚举可与 ?
运算符一起使用,以便在 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);
RunVariants
Continue(C)
照常进行下一阶段的操作。
Break(B)
退出操作而不运行后续阶段。
Implementations
Maps ControlFlow<B, C>
到 ControlFlow<T, C>
通过在中断值 (如果存在) 上应用函数来实现。
通常,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像 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);
RunTrait 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