本文簡要介紹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)
像往常一樣進入下一階段的操作。
Break(B)
退出操作而不運行後續階段。
相關用法
- Rust ControlFlow.break_value用法及代碼示例
- Rust ControlFlow.is_break用法及代碼示例
- Rust ControlFlow.is_continue用法及代碼示例
- Rust Condvar.notify_all用法及代碼示例
- Rust Condvar.wait用法及代碼示例
- Rust Condvar.wait_timeout用法及代碼示例
- Rust Condvar.wait_timeout_while用法及代碼示例
- Rust Condvar.wait_while用法及代碼示例
- Rust Condvar.new用法及代碼示例
- Rust Condvar用法及代碼示例
- Rust Condvar.notify_one用法及代碼示例
- Rust Concat用法及代碼示例
- Rust Condvar.wait_timeout_ms用法及代碼示例
- Rust Command.args用法及代碼示例
- Rust Cow.is_owned用法及代碼示例
- Rust Cow用法及代碼示例
- Rust Command.env用法及代碼示例
- Rust Command.env_remove用法及代碼示例
- Rust Command.get_args用法及代碼示例
- Rust Command.stdout用法及代碼示例
- Rust Command.stdin用法及代碼示例
- Rust Components用法及代碼示例
- Rust Component.as_os_str用法及代碼示例
- Rust Command.current_dir用法及代碼示例
- Rust Command.output用法及代碼示例
注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 Enum core::ops::ControlFlow。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。