pub struct MessageReader<'w, 's, E>where
E: Message,{ /* private fields */ }Expand description
Reads Messages of type T in order and tracks which messages have already been read.
§Concurrency
Unlike MessageWriter<T>, systems with MessageReader<T> param can be executed concurrently
(but not concurrently with MessageWriter<T> or MessageMutator<T> systems for the same message type).
Implementations§
Source§impl<'w, 's, E> MessageReader<'w, 's, E>where
E: Message,
impl<'w, 's, E> MessageReader<'w, 's, E>where
E: Message,
Sourcepub fn read(&mut self) -> MessageIterator<'_, E> ⓘ
pub fn read(&mut self) -> MessageIterator<'_, E> ⓘ
Iterates over the messages this MessageReader has not seen yet. This updates the
MessageReader’s message counter, which means subsequent message reads will not include messages
that happened before now.
Examples found in repository?
59fn read_and_write_different_message_types(mut a: MessageWriter<A>, mut b: MessageReader<B>) {
60 for _ in b.read() {}
61 a.write(A);
62}
63
64/// A dummy message type.
65#[derive(Debug, Clone, Message)]
66struct DebugMessage {
67 resend_from_param_set: bool,
68 resend_from_local_message_reader: bool,
69 times_sent: u8,
70}
71
72/// A system that sends all combinations of messages.
73fn send_messages(mut debug_messages: MessageWriter<DebugMessage>, frame_count: Res<FrameCount>) {
74 println!("Sending messages for frame {}", frame_count.0);
75
76 debug_messages.write(DebugMessage {
77 resend_from_param_set: false,
78 resend_from_local_message_reader: false,
79 times_sent: 1,
80 });
81 debug_messages.write(DebugMessage {
82 resend_from_param_set: true,
83 resend_from_local_message_reader: false,
84 times_sent: 1,
85 });
86 debug_messages.write(DebugMessage {
87 resend_from_param_set: false,
88 resend_from_local_message_reader: true,
89 times_sent: 1,
90 });
91 debug_messages.write(DebugMessage {
92 resend_from_param_set: true,
93 resend_from_local_message_reader: true,
94 times_sent: 1,
95 });
96}
97
98/// A system that prints all messages sent since the last time this system ran.
99///
100/// Note that some messages will be printed twice, because they were sent twice.
101fn debug_messages(mut messages: MessageReader<DebugMessage>) {
102 for message in messages.read() {
103 println!("{message:?}");
104 }
105}
106
107/// A system that both sends and receives messages using [`ParamSet`].
108fn send_and_receive_param_set(
109 mut param_set: ParamSet<(MessageReader<DebugMessage>, MessageWriter<DebugMessage>)>,
110 frame_count: Res<FrameCount>,
111) {
112 println!(
113 "Sending and receiving messages for frame {} with a `ParamSet`",
114 frame_count.0
115 );
116
117 // We must collect the messages to resend, because we can't access the writer while we're iterating over the reader.
118 let mut messages_to_resend = Vec::new();
119
120 // This is p0, as the first parameter in the `ParamSet` is the reader.
121 for message in param_set.p0().read() {
122 if message.resend_from_param_set {
123 messages_to_resend.push(message.clone());
124 }
125 }
126
127 // This is p1, as the second parameter in the `ParamSet` is the writer.
128 for mut message in messages_to_resend {
129 message.times_sent += 1;
130 param_set.p1().write(message);
131 }
132}More examples
- examples/3d/light_textures.rs
- examples/math/cubic_splines.rs
- examples/window/window_resizing.rs
- examples/async_tasks/external_source_external_thread.rs
- examples/input/char_input_events.rs
- examples/2d/tilemap_chunk.rs
- examples/2d/texture_atlas.rs
- examples/ecs/message.rs
- examples/2d/pixel_grid_snap.rs
- examples/audio/pitch.rs
- examples/animation/morph_targets.rs
- examples/app/log_layers_ecs.rs
- examples/ui/scroll.rs
- examples/transforms/align.rs
- examples/math/random_sampling.rs
- examples/3d/split_screen.rs
- examples/3d/tonemapping.rs
- examples/input/text_input.rs
- examples/3d/pcss.rs
- examples/input/mouse_input_events.rs
- examples/math/sampling_primitives.rs
- examples/testbed/full_ui.rs
- examples/input/gamepad_input_events.rs
- examples/3d/ssr.rs
- examples/3d/visibility_range.rs
- examples/ui/size_constraints.rs
- examples/ui/render_ui_to_texture.rs
- examples/3d/mixed_lighting.rs
Sourcepub fn read_with_id(&mut self) -> MessageIteratorWithId<'_, E> ⓘ
pub fn read_with_id(&mut self) -> MessageIteratorWithId<'_, E> ⓘ
Sourcepub fn par_read(&mut self) -> MessageParIter<'_, E>
pub fn par_read(&mut self) -> MessageParIter<'_, E>
Returns a parallel iterator over the messages this MessageReader has not seen yet.
See also for_each.
§Example
#[derive(Message)]
struct MyMessage {
value: usize,
}
#[derive(Resource, Default)]
struct Counter(AtomicUsize);
// setup
let mut world = World::new();
world.init_resource::<Messages<MyMessage>>();
world.insert_resource(Counter::default());
let mut schedule = Schedule::default();
schedule.add_systems(|mut messages: MessageReader<MyMessage>, counter: Res<Counter>| {
messages.par_read().for_each(|MyMessage { value }| {
counter.0.fetch_add(*value, Ordering::Relaxed);
});
});
for value in 0..100 {
world.write_message(MyMessage { value });
}
schedule.run(&mut world);
let Counter(counter) = world.remove_resource::<Counter>().unwrap();
// all messages were processed
assert_eq!(counter.into_inner(), 4950);Sourcepub fn len(&self) -> usize
pub fn len(&self) -> usize
Determines the number of messages available to be read from this MessageReader without consuming any.
Sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Returns true if there are no messages available to read.
§Example
The following example shows a useful pattern where some behavior is triggered if new messages are available.
MessageReader::clear() is used so the same messages don’t re-trigger the behavior the next time the system runs.
#[derive(Message)]
struct Collision;
fn play_collision_sound(mut messages: MessageReader<Collision>) {
if !messages.is_empty() {
messages.clear();
// Play a sound
}
}Examples found in repository?
249fn print_text(
250 handles: Res<TextAssets>,
251 texts: Res<Assets<Text>>,
252 mut asset_events: MessageReader<AssetEvent<Text>>,
253) {
254 if !asset_events.is_empty() {
255 // This prints the current values of the assets
256 // Hot-reloading is supported, so try modifying the source assets (and their meta files)!
257 println!("Current Values:");
258 println!(" a: {:?}", texts.get(&handles.a));
259 println!(" b: {:?}", texts.get(&handles.b));
260 println!(" c: {:?}", texts.get(&handles.c));
261 println!(" d: {:?}", texts.get(&handles.d));
262 println!(" e: {:?}", texts.get(&handles.e));
263 println!("(You can modify source assets and their .meta files to hot-reload changes!)");
264 println!();
265 asset_events.clear();
266 }
267}Sourcepub fn clear(&mut self)
pub fn clear(&mut self)
Consumes all available messages.
This means these messages will not appear in calls to MessageReader::read() or
MessageReader::read_with_id() and MessageReader::is_empty() will return true.
For usage, see MessageReader::is_empty().
Examples found in repository?
249fn print_text(
250 handles: Res<TextAssets>,
251 texts: Res<Assets<Text>>,
252 mut asset_events: MessageReader<AssetEvent<Text>>,
253) {
254 if !asset_events.is_empty() {
255 // This prints the current values of the assets
256 // Hot-reloading is supported, so try modifying the source assets (and their meta files)!
257 println!("Current Values:");
258 println!(" a: {:?}", texts.get(&handles.a));
259 println!(" b: {:?}", texts.get(&handles.b));
260 println!(" c: {:?}", texts.get(&handles.c));
261 println!(" d: {:?}", texts.get(&handles.d));
262 println!(" e: {:?}", texts.get(&handles.e));
263 println!("(You can modify source assets and their .meta files to hot-reload changes!)");
264 println!();
265 asset_events.clear();
266 }
267}Trait Implementations§
Source§impl<'w, 's, E> Debug for MessageReader<'w, 's, E>
impl<'w, 's, E> Debug for MessageReader<'w, 's, E>
Source§impl<E> SystemParam for MessageReader<'_, '_, E>where
E: Message,
impl<E> SystemParam for MessageReader<'_, '_, E>where
E: Message,
Source§type Item<'w, 's> = MessageReader<'w, 's, E>
type Item<'w, 's> = MessageReader<'w, 's, E>
Self, instantiated with new lifetimes. Read moreSource§fn init_state(
world: &mut World,
) -> <MessageReader<'_, '_, E> as SystemParam>::State
fn init_state( world: &mut World, ) -> <MessageReader<'_, '_, E> as SystemParam>::State
State.Source§fn init_access(
state: &<MessageReader<'_, '_, E> as SystemParam>::State,
system_meta: &mut SystemMeta,
component_access_set: &mut FilteredAccessSet,
world: &mut World,
)
fn init_access( state: &<MessageReader<'_, '_, E> as SystemParam>::State, system_meta: &mut SystemMeta, component_access_set: &mut FilteredAccessSet, world: &mut World, )
World access used by this SystemParamSource§fn apply(
state: &mut <MessageReader<'_, '_, E> as SystemParam>::State,
system_meta: &SystemMeta,
world: &mut World,
)
fn apply( state: &mut <MessageReader<'_, '_, E> as SystemParam>::State, system_meta: &SystemMeta, world: &mut World, )
SystemParam’s state.
This is used to apply Commands during ApplyDeferred.Source§fn queue(
state: &mut <MessageReader<'_, '_, E> as SystemParam>::State,
system_meta: &SystemMeta,
world: DeferredWorld<'_>,
)
fn queue( state: &mut <MessageReader<'_, '_, E> as SystemParam>::State, system_meta: &SystemMeta, world: DeferredWorld<'_>, )
ApplyDeferred.Source§unsafe fn validate_param<'w, 's>(
state: &'s mut <MessageReader<'_, '_, E> as SystemParam>::State,
_system_meta: &SystemMeta,
_world: UnsafeWorldCell<'w>,
) -> Result<(), SystemParamValidationError>
unsafe fn validate_param<'w, 's>( state: &'s mut <MessageReader<'_, '_, E> as SystemParam>::State, _system_meta: &SystemMeta, _world: UnsafeWorldCell<'w>, ) -> Result<(), SystemParamValidationError>
Source§unsafe fn get_param<'w, 's>(
state: &'s mut <MessageReader<'_, '_, E> as SystemParam>::State,
system_meta: &SystemMeta,
world: UnsafeWorldCell<'w>,
change_tick: Tick,
) -> <MessageReader<'_, '_, E> as SystemParam>::Item<'w, 's>
unsafe fn get_param<'w, 's>( state: &'s mut <MessageReader<'_, '_, E> as SystemParam>::State, system_meta: &SystemMeta, world: UnsafeWorldCell<'w>, change_tick: Tick, ) -> <MessageReader<'_, '_, E> as SystemParam>::Item<'w, 's>
SystemParamFunction. Read moreimpl<'w, 's, E> ReadOnlySystemParam for MessageReader<'w, 's, E>where
E: Message,
Local<'s, MessageCursor<E>>: ReadOnlySystemParam,
Res<'w, Messages<E>>: ReadOnlySystemParam,
Auto Trait Implementations§
impl<'w, 's, E> Freeze for MessageReader<'w, 's, E>
impl<'w, 's, E> RefUnwindSafe for MessageReader<'w, 's, E>where
E: RefUnwindSafe,
impl<'w, 's, E> Send for MessageReader<'w, 's, E>
impl<'w, 's, E> Sync for MessageReader<'w, 's, E>
impl<'w, 's, E> Unpin for MessageReader<'w, 's, E>
impl<'w, 's, E> !UnwindSafe for MessageReader<'w, 's, E>
Blanket Implementations§
Source§impl<T, U> AsBindGroupShaderType<U> for T
impl<T, U> AsBindGroupShaderType<U> for T
Source§fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
T ShaderType for self. When used in AsBindGroup
derives, it is safe to assume that all images in self exist.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
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§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.Source§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.Source§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.Source§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.Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§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>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§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>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§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.Source§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.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<S> FromSample<S> for S
impl<S> FromSample<S> for S
fn from_sample_(s: S) -> S
Source§impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
Source§impl<T> Identity for Twhere
T: ?Sized,
impl<T> Identity for Twhere
T: ?Sized,
Source§impl<T> InitializeFromFunction<T> for T
impl<T> InitializeFromFunction<T> for T
Source§fn initialize_from_function(f: fn() -> T) -> T
fn initialize_from_function(f: fn() -> T) -> T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
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> IntoResult<T> for T
impl<T> IntoResult<T> for T
Source§fn into_result(self) -> Result<T, RunSystemError>
fn into_result(self) -> Result<T, RunSystemError>
Source§impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
fn into_sample(self) -> T
Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<Ret> SpawnIfAsync<(), Ret> for Ret
impl<Ret> SpawnIfAsync<(), Ret> for Ret
Source§impl<T, O> SuperFrom<T> for Owhere
O: From<T>,
impl<T, O> SuperFrom<T> for Owhere
O: From<T>,
Source§fn super_from(input: T) -> O
fn super_from(input: T) -> O
Source§impl<T, O, M> SuperInto<O, M> for Twhere
O: SuperFrom<T, M>,
impl<T, O, M> SuperInto<O, M> for Twhere
O: SuperFrom<T, M>,
Source§fn super_into(self) -> O
fn super_into(self) -> O
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.