pub struct EventReader<'w, 's, E>where
E: Event,{ /* private fields */ }
Expand description
Reads events of type T
in order and tracks which events have already been read.
§Concurrency
Unlike EventWriter<T>
, systems with EventReader<T>
param can be executed concurrently
(but not concurrently with EventWriter<T>
or EventMutator<T>
systems for the same event type).
Implementations§
Source§impl<'w, 's, E> EventReader<'w, 's, E>where
E: Event,
impl<'w, 's, E> EventReader<'w, 's, E>where
E: Event,
Sourcepub fn read(&mut self) -> EventIterator<'_, E> ⓘ
pub fn read(&mut self) -> EventIterator<'_, E> ⓘ
Iterates over the events this EventReader
has not seen yet. This updates the
EventReader
’s event counter, which means subsequent event reads will not include events
that happened before now.
Examples found in repository?
59fn read_and_write_different_event_types(mut a: EventWriter<A>, mut b: EventReader<B>) {
60 for _ in b.read() {}
61 a.write(A);
62}
63
64/// A dummy event type.
65#[derive(Debug, Clone, Event)]
66struct DebugEvent {
67 resend_from_param_set: bool,
68 resend_from_local_event_reader: bool,
69 times_sent: u8,
70}
71
72/// A system that sends all combinations of events.
73fn send_events(mut events: EventWriter<DebugEvent>, frame_count: Res<FrameCount>) {
74 println!("Sending events for frame {}", frame_count.0);
75
76 events.write(DebugEvent {
77 resend_from_param_set: false,
78 resend_from_local_event_reader: false,
79 times_sent: 1,
80 });
81 events.write(DebugEvent {
82 resend_from_param_set: true,
83 resend_from_local_event_reader: false,
84 times_sent: 1,
85 });
86 events.write(DebugEvent {
87 resend_from_param_set: false,
88 resend_from_local_event_reader: true,
89 times_sent: 1,
90 });
91 events.write(DebugEvent {
92 resend_from_param_set: true,
93 resend_from_local_event_reader: true,
94 times_sent: 1,
95 });
96}
97
98/// A system that prints all events sent since the last time this system ran.
99///
100/// Note that some events will be printed twice, because they were sent twice.
101fn debug_events(mut events: EventReader<DebugEvent>) {
102 for event in events.read() {
103 println!("{event:?}");
104 }
105}
106
107/// A system that both sends and receives events using [`ParamSet`].
108fn send_and_receive_param_set(
109 mut param_set: ParamSet<(EventReader<DebugEvent>, EventWriter<DebugEvent>)>,
110 frame_count: Res<FrameCount>,
111) {
112 println!(
113 "Sending and receiving events for frame {} with a `ParamSet`",
114 frame_count.0
115 );
116
117 // We must collect the events to resend, because we can't access the writer while we're iterating over the reader.
118 let mut events_to_resend = Vec::new();
119
120 // This is p0, as the first parameter in the `ParamSet` is the reader.
121 for event in param_set.p0().read() {
122 if event.resend_from_param_set {
123 events_to_resend.push(event.clone());
124 }
125 }
126
127 // This is p1, as the second parameter in the `ParamSet` is the writer.
128 for mut event in events_to_resend {
129 event.times_sent += 1;
130 param_set.p1().write(event);
131 }
132}
More examples
- 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/ecs/event.rs
- examples/2d/texture_atlas.rs
- examples/2d/pixel_grid_snap.rs
- examples/audio/pitch.rs
- examples/app/log_layers_ecs.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/testbed/full_ui.rs
- examples/ui/scroll.rs
- examples/3d/pcss.rs
- examples/input/mouse_input_events.rs
- examples/math/sampling_primitives.rs
- examples/input/gamepad_input_events.rs
- examples/3d/ssr.rs
- examples/3d/visibility_range.rs
- examples/ui/size_constraints.rs
- examples/3d/mixed_lighting.rs
Sourcepub fn read_with_id(&mut self) -> EventIteratorWithId<'_, E> ⓘ
pub fn read_with_id(&mut self) -> EventIteratorWithId<'_, E> ⓘ
Sourcepub fn par_read(&mut self) -> EventParIter<'_, E>
pub fn par_read(&mut self) -> EventParIter<'_, E>
Returns a parallel iterator over the events this EventReader
has not seen yet.
See also for_each
.
§Example
#[derive(Event)]
struct MyEvent {
value: usize,
}
#[derive(Resource, Default)]
struct Counter(AtomicUsize);
// setup
let mut world = World::new();
world.init_resource::<Events<MyEvent>>();
world.insert_resource(Counter::default());
let mut schedule = Schedule::default();
schedule.add_systems(|mut events: EventReader<MyEvent>, counter: Res<Counter>| {
events.par_read().for_each(|MyEvent { value }| {
counter.0.fetch_add(*value, Ordering::Relaxed);
});
});
for value in 0..100 {
world.send_event(MyEvent { value });
}
schedule.run(&mut world);
let Counter(counter) = world.remove_resource::<Counter>().unwrap();
// all events were processed
assert_eq!(counter.into_inner(), 4950);
Sourcepub fn len(&self) -> usize
pub fn len(&self) -> usize
Determines the number of events available to be read from this EventReader
without consuming any.
Sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Returns true
if there are no events available to read.
§Example
The following example shows a useful pattern where some behavior is triggered if new events are available.
EventReader::clear()
is used so the same events don’t re-trigger the behavior the next time the system runs.
#[derive(Event)]
struct CollisionEvent;
fn play_collision_sound(mut events: EventReader<CollisionEvent>) {
if !events.is_empty() {
events.clear();
// Play a sound
}
}
Examples found in repository?
394fn play_collision_sound(
395 mut commands: Commands,
396 mut collision_events: EventReader<CollisionEvent>,
397 sound: Res<CollisionSound>,
398) {
399 // Play a sound once per frame if a collision occurred.
400 if !collision_events.is_empty() {
401 // This prevents events staying active on the next frame.
402 collision_events.clear();
403 commands.spawn((AudioPlayer(sound.clone()), PlaybackSettings::DESPAWN));
404 }
405}
More examples
249fn print_text(
250 handles: Res<TextAssets>,
251 texts: Res<Assets<Text>>,
252 mut asset_events: EventReader<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 events.
This means these events will not appear in calls to EventReader::read()
or
EventReader::read_with_id()
and EventReader::is_empty()
will return true
.
For usage, see EventReader::is_empty()
.
Examples found in repository?
394fn play_collision_sound(
395 mut commands: Commands,
396 mut collision_events: EventReader<CollisionEvent>,
397 sound: Res<CollisionSound>,
398) {
399 // Play a sound once per frame if a collision occurred.
400 if !collision_events.is_empty() {
401 // This prevents events staying active on the next frame.
402 collision_events.clear();
403 commands.spawn((AudioPlayer(sound.clone()), PlaybackSettings::DESPAWN));
404 }
405}
More examples
249fn print_text(
250 handles: Res<TextAssets>,
251 texts: Res<Assets<Text>>,
252 mut asset_events: EventReader<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 EventReader<'w, 's, E>
impl<'w, 's, E> Debug for EventReader<'w, 's, E>
Source§impl<E> SystemParam for EventReader<'_, '_, E>where
E: Event,
impl<E> SystemParam for EventReader<'_, '_, E>where
E: Event,
Source§type Item<'w, 's> = EventReader<'w, 's, E>
type Item<'w, 's> = EventReader<'w, 's, E>
Self
, instantiated with new lifetimes. Read moreSource§fn init_state(
world: &mut World,
system_meta: &mut SystemMeta,
) -> <EventReader<'_, '_, E> as SystemParam>::State
fn init_state( world: &mut World, system_meta: &mut SystemMeta, ) -> <EventReader<'_, '_, E> as SystemParam>::State
World
access used by this SystemParam
and creates a new instance of this param’s State
.Source§unsafe fn new_archetype(
state: &mut <EventReader<'_, '_, E> as SystemParam>::State,
archetype: &Archetype,
system_meta: &mut SystemMeta,
)
unsafe fn new_archetype( state: &mut <EventReader<'_, '_, E> as SystemParam>::State, archetype: &Archetype, system_meta: &mut SystemMeta, )
Archetype
, registers the components accessed by this SystemParam
(if applicable).a Read moreSource§fn apply(
state: &mut <EventReader<'_, '_, E> as SystemParam>::State,
system_meta: &SystemMeta,
world: &mut World,
)
fn apply( state: &mut <EventReader<'_, '_, 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 <EventReader<'_, '_, E> as SystemParam>::State,
system_meta: &SystemMeta,
world: DeferredWorld<'_>,
)
fn queue( state: &mut <EventReader<'_, '_, E> as SystemParam>::State, system_meta: &SystemMeta, world: DeferredWorld<'_>, )
ApplyDeferred
.Source§unsafe fn validate_param<'w, 's>(
state: &'s <EventReader<'_, '_, E> as SystemParam>::State,
_system_meta: &SystemMeta,
_world: UnsafeWorldCell<'w>,
) -> Result<(), SystemParamValidationError>
unsafe fn validate_param<'w, 's>( state: &'s <EventReader<'_, '_, E> as SystemParam>::State, _system_meta: &SystemMeta, _world: UnsafeWorldCell<'w>, ) -> Result<(), SystemParamValidationError>
Source§unsafe fn get_param<'w, 's>(
state: &'s mut <EventReader<'_, '_, E> as SystemParam>::State,
system_meta: &SystemMeta,
world: UnsafeWorldCell<'w>,
change_tick: Tick,
) -> <EventReader<'_, '_, E> as SystemParam>::Item<'w, 's>
unsafe fn get_param<'w, 's>( state: &'s mut <EventReader<'_, '_, E> as SystemParam>::State, system_meta: &SystemMeta, world: UnsafeWorldCell<'w>, change_tick: Tick, ) -> <EventReader<'_, '_, E> as SystemParam>::Item<'w, 's>
SystemParamFunction
. Read moreimpl<'w, 's, E> ReadOnlySystemParam for EventReader<'w, 's, E>where
E: Event,
Local<'s, EventCursor<E>>: ReadOnlySystemParam,
Res<'w, Events<E>>: ReadOnlySystemParam,
Auto Trait Implementations§
impl<'w, 's, E> Freeze for EventReader<'w, 's, E>
impl<'w, 's, E> RefUnwindSafe for EventReader<'w, 's, E>where
E: RefUnwindSafe,
impl<'w, 's, E> Send for EventReader<'w, 's, E>
impl<'w, 's, E> Sync for EventReader<'w, 's, E>
impl<'w, 's, E> Unpin for EventReader<'w, 's, E>
impl<'w, 's, E> !UnwindSafe for EventReader<'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> 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<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<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.