pub enum ControlFlow<B, C = ()> {
Continue(C),
Break(B),
}
Expand description
Used to tell an operation whether it should exit early or go on as usual.
This is used when exposing things (like graph traversals or visitors) where
you want the user to be able to choose whether to exit early.
Having the enum makes it clearer โ no more wondering โwait, what did false
mean again?โ โ and allows including a value.
Similar to Option
and Result
, this enum can be used with the ?
operator
to return immediately if the Break
variant is present or otherwise continue normally
with the value inside the Continue
variant.
ยงExamples
Early-exiting from 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));
A basic tree traversal:
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);
Variantsยง
Continue(C)
Move on to the next phase of the operation as normal.
Break(B)
Exit the operation without running subsequent phases.
Implementationsยง
Sourceยงimpl<B, C> ControlFlow<B, C>
impl<B, C> ControlFlow<B, C>
1.59.0 ยท Sourcepub fn is_break(&self) -> bool
pub fn is_break(&self) -> bool
Returns true
if this is a Break
variant.
ยงExamples
use std::ops::ControlFlow;
assert!(ControlFlow::<&str, i32>::Break("Stop right there!").is_break());
assert!(!ControlFlow::<&str, i32>::Continue(3).is_break());
1.59.0 ยท Sourcepub fn is_continue(&self) -> bool
pub fn is_continue(&self) -> bool
Returns true
if this is a Continue
variant.
ยงExamples
use std::ops::ControlFlow;
assert!(!ControlFlow::<&str, i32>::Break("Stop right there!").is_continue());
assert!(ControlFlow::<&str, i32>::Continue(3).is_continue());
1.83.0 ยท Sourcepub fn break_value(self) -> Option<B>
pub fn break_value(self) -> Option<B>
Converts the ControlFlow
into an Option
which is Some
if the
ControlFlow
was Break
and None
otherwise.
ยงExamples
use std::ops::ControlFlow;
assert_eq!(ControlFlow::<&str, i32>::Break("Stop right there!").break_value(), Some("Stop right there!"));
assert_eq!(ControlFlow::<&str, i32>::Continue(3).break_value(), None);
1.83.0 ยท Sourcepub fn map_break<T>(self, f: impl FnOnce(B) -> T) -> ControlFlow<T, C>
pub fn map_break<T>(self, f: impl FnOnce(B) -> T) -> ControlFlow<T, C>
Maps ControlFlow<B, C>
to ControlFlow<T, C>
by applying a function
to the break value in case it exists.
1.83.0 ยท Sourcepub fn continue_value(self) -> Option<C>
pub fn continue_value(self) -> Option<C>
Converts the ControlFlow
into an Option
which is Some
if the
ControlFlow
was Continue
and None
otherwise.
ยงExamples
use std::ops::ControlFlow;
assert_eq!(ControlFlow::<&str, i32>::Break("Stop right there!").continue_value(), None);
assert_eq!(ControlFlow::<&str, i32>::Continue(3).continue_value(), Some(3));
1.83.0 ยท Sourcepub fn map_continue<T>(self, f: impl FnOnce(C) -> T) -> ControlFlow<B, T>
pub fn map_continue<T>(self, f: impl FnOnce(C) -> T) -> ControlFlow<B, T>
Maps ControlFlow<B, C>
to ControlFlow<B, T>
by applying a function
to the continue value in case it exists.
Sourceยงimpl<T> ControlFlow<T, T>
impl<T> ControlFlow<T, T>
Sourcepub const fn into_value(self) -> T
๐ฌThis is a nightly-only experimental API. (control_flow_into_value
)
pub const fn into_value(self) -> T
control_flow_into_value
)Extracts the value T
that is wrapped by ControlFlow<T, T>
.
ยงExamples
#![feature(control_flow_into_value)]
use std::ops::ControlFlow;
assert_eq!(ControlFlow::<i32, i32>::Break(1024).into_value(), 1024);
assert_eq!(ControlFlow::<i32, i32>::Continue(512).into_value(), 512);
impl<R> ControlFlow<R, <R as Try>::Output>where
R: Try,
These are used only as part of implementing the iterator adapters. They have mediocre names and non-obvious semantics, so arenโt currently on a path to potential stabilization.
Trait Implementationsยง
1.55.0 ยท Sourceยงimpl<B, C> Clone for ControlFlow<B, C>
impl<B, C> Clone for ControlFlow<B, C>
Sourceยงfn clone(&self) -> ControlFlow<B, C>
fn clone(&self) -> ControlFlow<B, C>
1.0.0 ยท Sourceยงfn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read more1.55.0 ยท Sourceยงimpl<B, C> Debug for ControlFlow<B, C>
impl<B, C> Debug for ControlFlow<B, C>
ยงimpl From<Error> for ControlFlow<Error, Error>
impl From<Error> for ControlFlow<Error, Error>
ยงfn from(value: Error) -> ControlFlow<Error, Error>
fn from(value: Error) -> ControlFlow<Error, Error>
Sourceยงimpl<B, C> FromResidual<ControlFlow<B, Infallible>> for ControlFlow<B, C>
impl<B, C> FromResidual<ControlFlow<B, Infallible>> for ControlFlow<B, C>
Sourceยงfn from_residual(residual: ControlFlow<B, Infallible>) -> ControlFlow<B, C>
fn from_residual(residual: ControlFlow<B, Infallible>) -> ControlFlow<B, C>
try_trait_v2
)Residual
type. Read more1.55.0 ยท Sourceยงimpl<B, C> Hash for ControlFlow<B, C>
impl<B, C> Hash for ControlFlow<B, C>
1.55.0 ยท Sourceยงimpl<B, C> PartialEq for ControlFlow<B, C>
impl<B, C> PartialEq for ControlFlow<B, C>
Sourceยงimpl<B, C> Residual<C> for ControlFlow<B, Infallible>
impl<B, C> Residual<C> for ControlFlow<B, Infallible>
Sourceยงtype TryType = ControlFlow<B, C>
type TryType = ControlFlow<B, C>
try_trait_v2_residual
)Sourceยงimpl<B, C> Try for ControlFlow<B, C>
impl<B, C> Try for ControlFlow<B, C>
Sourceยงtype Output = C
type Output = C
try_trait_v2
)?
when not short-circuiting.Sourceยงtype Residual = ControlFlow<B, Infallible>
type Residual = ControlFlow<B, Infallible>
try_trait_v2
)FromResidual::from_residual
as part of ?
when short-circuiting. Read moreSourceยงfn from_output(output: <ControlFlow<B, C> as Try>::Output) -> ControlFlow<B, C>
fn from_output(output: <ControlFlow<B, C> as Try>::Output) -> ControlFlow<B, C>
try_trait_v2
)Output
type. Read moreSourceยงfn branch(
self,
) -> ControlFlow<<ControlFlow<B, C> as Try>::Residual, <ControlFlow<B, C> as Try>::Output>
fn branch( self, ) -> ControlFlow<<ControlFlow<B, C> as Try>::Residual, <ControlFlow<B, C> as Try>::Output>
try_trait_v2
)?
to decide whether the operator should produce a value
(because this returned ControlFlow::Continue
)
or propagate a value back to the caller
(because this returned ControlFlow::Break
). Read moreimpl<B, C> Copy for ControlFlow<B, C>
impl<B, C> Eq for ControlFlow<B, C>
impl<B, C> StructuralPartialEq for ControlFlow<B, C>
Auto Trait Implementationsยง
impl<B, C> Freeze for ControlFlow<B, C>
impl<B, C> RefUnwindSafe for ControlFlow<B, C>where
C: RefUnwindSafe,
B: RefUnwindSafe,
impl<B, C> Send for ControlFlow<B, C>
impl<B, C> Sync for ControlFlow<B, C>
impl<B, C> Unpin for ControlFlow<B, C>
impl<B, C> UnwindSafe for ControlFlow<B, C>where
C: UnwindSafe,
B: UnwindSafe,
Blanket Implementationsยง
Sourceยงimpl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
Sourceยงfn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
Sourceยงfn adapt_into(self) -> D
fn adapt_into(self) -> D
ยงimpl<T> ArchivePointee for T
impl<T> ArchivePointee for T
ยงtype ArchivedMetadata = ()
type ArchivedMetadata = ()
ยงfn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
Sourceยงimpl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
Sourceยงfn arrays_from(colors: C) -> T
fn arrays_from(colors: C) -> T
Sourceยงimpl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
Sourceยงfn arrays_into(self) -> C
fn arrays_into(self) -> C
Sourceยงimpl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Sourceยงfn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
ยงimpl<T> CallHasher for T
impl<T> CallHasher for T
Sourceยงimpl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
Sourceยงtype Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
parameters
when converting.Sourceยงfn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
fn cam16_into_unclamped( self, parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>, ) -> T
self
into C
, using the provided parameters.Sourceยงimpl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Sourceยงimpl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
Sourceยงfn components_from(colors: C) -> T
fn components_from(colors: C) -> T
ยงimpl<F, W, T, D> Deserialize<With<T, W>, D> for F
impl<F, W, T, D> Deserialize<With<T, W>, D> for F
ยงfn deserialize(
&self,
deserializer: &mut D,
) -> Result<With<T, W>, <D as Fallible>::Error>
fn deserialize( &self, deserializer: &mut D, ) -> Result<With<T, W>, <D as Fallible>::Error>
ยงimpl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
ยงfn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
, which can then be
downcast
into Box<dyn ConcreteType>
where ConcreteType
implements Trait
.ยงfn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
, which can then be further
downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.ยงfn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
โs vtable from &Trait
โs.ยงfn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
โs vtable from &mut Trait
โs.ยงimpl<T> DowncastSend for T
impl<T> DowncastSend for T
ยงimpl<T> DowncastSync for T
impl<T> DowncastSync for T
ยงimpl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
ยงfn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
ยงimpl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
ยงfn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.Sourceยงimpl<T> FromAngle<T> for T
impl<T> FromAngle<T> for T
Sourceยงfn from_angle(angle: T) -> T
fn from_angle(angle: T) -> T
angle
.Sourceยงimpl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
Sourceยงfn from_stimulus(other: U) -> T
fn from_stimulus(other: U) -> T
other
into Self
, while performing the appropriate scaling,
rounding and clamping.ยงimpl<T> Instrument for T
impl<T> Instrument for T
ยงfn instrument(self, span: Span) -> Instrumented<Self> โ
fn instrument(self, span: Span) -> Instrumented<Self> โ
Sourceยงimpl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
Sourceยงfn into_angle(self) -> U
fn into_angle(self) -> U
T
.Sourceยงimpl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
Sourceยงtype Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
parameters
when converting.Sourceยงfn into_cam16_unclamped(
self,
parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>,
) -> T
fn into_cam16_unclamped( self, parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>, ) -> T
self
into C
, using the provided parameters.Sourceยงimpl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
Sourceยงfn into_color(self) -> U
fn into_color(self) -> U
Sourceยงimpl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
Sourceยงfn into_color_unclamped(self) -> U
fn into_color_unclamped(self) -> U
Sourceยงimpl<T> IntoEither for T
impl<T> IntoEither for T
Sourceยงfn into_either(self, into_left: bool) -> Either<Self, Self> โ
fn into_either(self, into_left: bool) -> Either<Self, Self> โ
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSourceยงfn into_either_with<F>(self, into_left: F) -> Either<Self, Self> โ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> โ
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSourceยงimpl<T> IntoStimulus<T> for T
impl<T> IntoStimulus<T> for T
Sourceยงfn into_stimulus(self) -> T
fn into_stimulus(self) -> T
self
into T
, while performing the appropriate scaling,
rounding and clamping.ยงimpl<T> Pointable for T
impl<T> Pointable for T
ยงimpl<T> Pointee for T
impl<T> Pointee for T
ยงimpl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
ยงimpl<T> SerializableKey for T
impl<T> SerializableKey for T
ยงimpl<T> StorageAccess<T> for T
impl<T> StorageAccess<T> for T
ยงfn as_borrowed(&self) -> &T
fn as_borrowed(&self) -> &T
ยงfn into_taken(self) -> T
fn into_taken(self) -> T
Sourceยงimpl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
Sourceยงtype Error = <C as TryFromComponents<T>>::Error
type Error = <C as TryFromComponents<T>>::Error
try_into_colors
fails to cast.Sourceยงfn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
Sourceยงimpl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
Sourceยงfn try_into_color(self) -> Result<U, OutOfBounds<U>>
fn try_into_color(self) -> Result<U, OutOfBounds<U>>
OutOfBounds
error is returned which contains
the unclamped color. Read more