Enum otter_api_tests::imports::failure::_core::ops::ControlFlow [−][src]
pub enum ControlFlow<B, C = ()> { Continue(C), Break(B), }
🔬 This is a nightly-only experimental API. (control_flow_enum
)
new API
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.
Examples
Early-exiting from Iterator::try_for_each
:
#![feature(control_flow_enum)] 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:
#![feature(control_flow_enum)] 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(()) } }
Variants
🔬 This is a nightly-only experimental API. (control_flow_enum
)
new API
Move on to the next phase of the operation as normal.
🔬 This is a nightly-only experimental API. (control_flow_enum
)
new API
Exit the operation without running subsequent phases.
Implementations
🔬 This is a nightly-only experimental API. (control_flow_enum
)
new API
🔬 This is a nightly-only experimental API. (control_flow_enum
)
new API
Returns true
if this is a Break
variant.
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());
🔬 This is a nightly-only experimental API. (control_flow_enum
)
new API
🔬 This is a nightly-only experimental API. (control_flow_enum
)
new API
Returns true
if this is a Continue
variant.
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());
🔬 This is a nightly-only experimental API. (control_flow_enum
)
new API
🔬 This is a nightly-only experimental API. (control_flow_enum
)
new API
Converts the ControlFlow
into an Option
which is Some
if the
ControlFlow
was Break
and None
otherwise.
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);
🔬 This is a nightly-only experimental API. (control_flow_enum
)
new API
🔬 This is a nightly-only experimental API. (control_flow_enum
)
new API
Maps ControlFlow<B, C>
to ControlFlow<T, C>
by applying a function
to the break value in case it exists.
🔬 This is a nightly-only experimental API. (control_flow_enum
)
new API
🔬 This is a nightly-only experimental API. (control_flow_enum
)
new API
It’s frequently the case that there’s no value needed with Continue
,
so this provides a way to avoid typing (())
, if you prefer it.
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));
🔬 This is a nightly-only experimental API. (control_flow_enum
)
new API
🔬 This is a nightly-only experimental API. (control_flow_enum
)
new API
APIs like try_for_each
don’t need values with Break
,
so this provides a way to avoid typing (())
, if you prefer it.
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);
Trait Implementations
try_trait_v2
)Constructs the type from a compatible Residual
type. Read more
impl<B, C> PartialEq<ControlFlow<B, C>> for ControlFlow<B, C> where
C: PartialEq<C>,
B: PartialEq<B>,
[src]
impl<B, C> PartialEq<ControlFlow<B, C>> for ControlFlow<B, C> where
C: PartialEq<C>,
B: PartialEq<B>,
[src]This method tests for self
and other
values to be equal, and is used
by ==
. Read more
This method tests for !=
.
type Output = C
type Output = C
try_trait_v2
)The type of the value produced by ?
when not short-circuiting.
type Residual = ControlFlow<B, Infallible>
type Residual = ControlFlow<B, Infallible>
try_trait_v2
)The type of the value passed to FromResidual::from_residual
as part of ?
when short-circuiting. Read more
try_trait_v2
)Constructs the type from its Output
type. Read more
pub fn branch(
self
) -> ControlFlow<<ControlFlow<B, C> as Try>::Residual, <ControlFlow<B, C> as Try>::Output>
[src]
pub fn branch(
self
) -> ControlFlow<<ControlFlow<B, C> as Try>::Residual, <ControlFlow<B, C> as Try>::Output>
[src]try_trait_v2
)Used in ?
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 more
Auto Trait Implementations
impl<B, C> RefUnwindSafe for ControlFlow<B, C> where
B: RefUnwindSafe,
C: RefUnwindSafe,
impl<B, C> Send for ControlFlow<B, C> where
B: Send,
C: Send,
impl<B, C> Sync for ControlFlow<B, C> where
B: Sync,
C: Sync,
impl<B, C> Unpin for ControlFlow<B, C> where
B: Unpin,
C: Unpin,
impl<B, C> UnwindSafe for ControlFlow<B, C> where
B: UnwindSafe,
C: UnwindSafe,
Blanket Implementations
Mutably borrows from an owned value. Read more
pub fn into_any(self: Box<T, Global>) -> Box<dyn Any + 'static, Global>ⓘNotable traits for Box<R, Global>
impl<R> Read for Box<R, Global> where
R: Read + ?Sized, impl<W> Write for Box<W, Global> where
W: Write + ?Sized, impl<I, A> Iterator for Box<I, A> where
A: Allocator,
I: Iterator + ?Sized, type Item = <I as Iterator>::Item;impl<F, A> Future for Box<F, A> where
A: Allocator + 'static,
F: Future + Unpin + ?Sized, type Output = <F as Future>::Output;
pub fn into_any(self: Box<T, Global>) -> Box<dyn Any + 'static, Global>ⓘNotable traits for Box<R, Global>
impl<R> Read for Box<R, Global> where
R: Read + ?Sized, impl<W> Write for Box<W, Global> where
W: Write + ?Sized, impl<I, A> Iterator for Box<I, A> where
A: Allocator,
I: Iterator + ?Sized, type Item = <I as Iterator>::Item;impl<F, A> Future for Box<F, A> where
A: Allocator + 'static,
F: Future + Unpin + ?Sized, type Output = <F as Future>::Output;
Convert Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
. Read more
pub fn into_any_rc(self: Rc<T>) -> Rc<dyn Any + 'static>
pub fn into_any_rc(self: Rc<T>) -> Rc<dyn Any + 'static>
Convert Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
. Read more
Convert &Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s. Read more
pub fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
pub fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
Convert &mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s. Read more
impl<A> DynCastExt for A
impl<A> DynCastExt for A
pub fn dyn_cast<T>(
self
) -> Result<<A as DynCastExtHelper<T>>::Target, <A as DynCastExtHelper<T>>::Source> where
T: ?Sized,
A: DynCastExtHelper<T>,
pub fn dyn_cast<T>(
self
) -> Result<<A as DynCastExtHelper<T>>::Target, <A as DynCastExtHelper<T>>::Source> where
T: ?Sized,
A: DynCastExtHelper<T>,
Use this to cast from one trait object type to another. Read more
pub fn dyn_upcast<T>(self) -> <A as DynCastExtAdvHelper<T, T>>::Target where
T: ?Sized,
A: DynCastExtAdvHelper<T, T, Source = <A as DynCastExtAdvHelper<T, T>>::Target>,
pub fn dyn_upcast<T>(self) -> <A as DynCastExtAdvHelper<T, T>>::Target where
T: ?Sized,
A: DynCastExtAdvHelper<T, T, Source = <A as DynCastExtAdvHelper<T, T>>::Target>,
Use this to upcast a trait to one of its supertraits. Read more
pub fn dyn_cast_adv<F, T>(
self
) -> Result<<A as DynCastExtAdvHelper<F, T>>::Target, <A as DynCastExtAdvHelper<F, T>>::Source> where
T: ?Sized,
A: DynCastExtAdvHelper<F, T>,
F: ?Sized,
pub fn dyn_cast_adv<F, T>(
self
) -> Result<<A as DynCastExtAdvHelper<F, T>>::Target, <A as DynCastExtAdvHelper<F, T>>::Source> where
T: ?Sized,
A: DynCastExtAdvHelper<F, T>,
F: ?Sized,
pub fn dyn_cast_with_config<C>(
self
) -> Result<<A as DynCastExtAdvHelper<<C as DynCastConfig>::Source, <C as DynCastConfig>::Target>>::Target, <A as DynCastExtAdvHelper<<C as DynCastConfig>::Source, <C as DynCastConfig>::Target>>::Source> where
C: DynCastConfig,
A: DynCastExtAdvHelper<<C as DynCastConfig>::Source, <C as DynCastConfig>::Target>,
pub fn dyn_cast_with_config<C>(
self
) -> Result<<A as DynCastExtAdvHelper<<C as DynCastConfig>::Source, <C as DynCastConfig>::Target>>::Target, <A as DynCastExtAdvHelper<<C as DynCastConfig>::Source, <C as DynCastConfig>::Target>>::Source> where
C: DynCastConfig,
A: DynCastExtAdvHelper<<C as DynCastConfig>::Source, <C as DynCastConfig>::Target>,
Use this to cast from one trait object type to another. With this method the type parameter is a config type that uniquely specifies which cast should be preformed. Read more
fn instrument(self, span: Span) -> Instrumented<Self>ⓘNotable traits for Instrumented<T>
impl<T> Future for Instrumented<T> where
T: Future, type Output = <T as Future>::Output;
[src]
fn instrument(self, span: Span) -> Instrumented<Self>ⓘNotable traits for Instrumented<T>
impl<T> Future for Instrumented<T> where
T: Future, type Output = <T as Future>::Output;
[src]Instruments this type with the provided Span
, returning an
Instrumented
wrapper. Read more
fn in_current_span(self) -> Instrumented<Self>ⓘNotable traits for Instrumented<T>
impl<T> Future for Instrumented<T> where
T: Future, type Output = <T as Future>::Output;
[src]
fn in_current_span(self) -> Instrumented<Self>ⓘNotable traits for Instrumented<T>
impl<T> Future for Instrumented<T> where
T: Future, type Output = <T as Future>::Output;
[src]pub fn vzip(self) -> V