pub struct MessageReader<'w, 's, M>where
M: Message,{ /* private fields */ }Expand description
Reads Messages of type T in order and tracks which messages have already been read.
Use PopulatedMessageReader<T> to skip the system if there are no messages.
§Usage
#[derive(Message)]
pub struct MyMessage(String); // Custom message type.
fn my_system(mut reader: MessageReader<MyMessage>) {
for msg in reader.read() {
println!("{}", msg.0)
}
}
§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, M> MessageReader<'w, 's, M>where
M: Message,
impl<'w, 's, M> MessageReader<'w, 's, M>where
M: Message,
Sourcepub fn read(&mut self) -> MessageIterator<'_, M> ⓘ
pub fn read(&mut self) -> MessageIterator<'_, M> ⓘ
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?
More examples
437fn handle_selection_change(
438 mut events: MessageReader<WidgetClickEvent<Selection>>,
439 mut app_status: ResMut<AppStatus>,
440) {
441 for event in events.read() {
442 app_status.selection = **event;
443 }
444}
445
446fn toggle_visibility(
447 mut events: MessageReader<WidgetClickEvent<Visibility>>,
448 app_status: Res<AppStatus>,
449 mut visibility: Query<(&mut Visibility, &Selection)>,
450) {
451 if let Some(vis) = events.read().last() {
452 for (mut visibility, selection) in visibility.iter_mut() {
453 if selection == &app_status.selection {
454 *visibility = **vis;
455 }
456 }
457 }
458}295fn handle_mouse_move(
296 mut cursor_moved_reader: MessageReader<CursorMoved>,
297 mut mouse_position: ResMut<MousePosition>,
298) {
299 if let Some(cursor_moved) = cursor_moved_reader.read().last() {
300 mouse_position.0 = Some(cursor_moved.position);
301 }
302}
303
304/// This system handles updating the [`MouseEditMove`] resource, orchestrating the logical part
305/// of the click-and-drag motion which actually creates new control points.
306fn handle_mouse_press(
307 mut mouse_button_input_reader: MessageReader<MouseButtonInput>,
308 mouse_position: Res<MousePosition>,
309 mut edit_move: ResMut<MouseEditMove>,
310 mut control_points: ResMut<ControlPoints>,
311 camera: Single<(&Camera, &GlobalTransform)>,
312) {
313 let Some(mouse_pos) = mouse_position.0 else {
314 return;
315 };
316
317 // Handle click and drag behavior
318 for mouse_button_input in mouse_button_input_reader.read() {
319 if mouse_button_input.button != MouseButton::Left {
320 continue;
321 }
322
323 match mouse_button_input.state {
324 ButtonState::Pressed => {
325 if edit_move.start.is_some() {
326 // If the edit move already has a start, press event should do nothing.
327 continue;
328 }
329 // This press represents the start of the edit move.
330 edit_move.start = Some(mouse_pos);
331 }
332
333 ButtonState::Released => {
334 // Release is only meaningful if we started an edit move.
335 let Some(start) = edit_move.start else {
336 continue;
337 };
338
339 let (camera, camera_transform) = *camera;
340
341 // Convert the starting point and end point (current mouse pos) into world coords:
342 let Ok(point) = camera.viewport_to_world_2d(camera_transform, start) else {
343 continue;
344 };
345 let Ok(end_point) = camera.viewport_to_world_2d(camera_transform, mouse_pos) else {
346 continue;
347 };
348 let tangent = end_point - point;
349
350 // The start of the click-and-drag motion represents the point to add,
351 // while the difference with the current position represents the tangent.
352 control_points.points_and_tangents.push((point, tangent));
353
354 // Reset the edit move since we've consumed it.
355 edit_move.start = None;
356 }
357 }
358 }
359}- examples/3d/clustered_decal_maps.rs
- examples/window/window_resizing.rs
- examples/app/settings.rs
- examples/async_tasks/external_source_external_thread.rs
- examples/input/char_input_events.rs
- examples/2d/texture_atlas.rs
- examples/3d/light_probe_blending.rs
- examples/ecs/message.rs
- examples/2d/pixel_grid_snap.rs
- examples/audio/pitch.rs
- examples/animation/morph_targets.rs
- examples/window/persisting_window_settings.rs
- examples/app/log_layers_ecs.rs
- examples/picking/custom_hit_data.rs
- examples/ui/scroll_and_overflow/scroll.rs
- examples/transforms/align.rs
- examples/math/random_sampling.rs
- examples/3d/split_screen.rs
- examples/3d/tonemapping.rs
- examples/2d/dynamic_mip_generation.rs
- examples/3d/pccm.rs
- examples/3d/pcss.rs
- examples/3d/mirror.rs
- examples/input/mouse_input_events.rs
- examples/testbed/full_ui.rs
- examples/input/gamepad_input_events.rs
- examples/3d/ssr.rs
- examples/3d/visibility_range.rs
- examples/ui/layout/size_constraints.rs
- examples/ui/render_ui_to_texture.rs
- examples/3d/mixed_lighting.rs
- examples/3d/contact_shadows.rs
Sourcepub fn read_with_id(&mut self) -> MessageIteratorWithId<'_, M> ⓘ
pub fn read_with_id(&mut self) -> MessageIteratorWithId<'_, M> ⓘ
Sourcepub fn par_read(&mut self) -> MessageParIter<'_, M>
Available on crate feature multi_threaded only.
pub fn par_read(&mut self) -> MessageParIter<'_, M>
multi_threaded only.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?
113fn extract_components(
114 b: Extract<Query<(RenderEntity, &B)>>,
115 c: Extract<Query<(RenderEntity, &C)>>,
116 mut reader: Extract<MessageReader<ExtractMessage>>,
117 mut commands: Commands,
118) {
119 for (entity, b) in &b {
120 commands.entity(entity).insert(b.clone());
121 }
122
123 if !reader.is_empty() {
124 for (entity, c) in &c {
125 commands.entity(entity).insert(c.clone());
126 }
127 reader.clear();
128 }
129}More examples
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?
113fn extract_components(
114 b: Extract<Query<(RenderEntity, &B)>>,
115 c: Extract<Query<(RenderEntity, &C)>>,
116 mut reader: Extract<MessageReader<ExtractMessage>>,
117 mut commands: Commands,
118) {
119 for (entity, b) in &b {
120 commands.entity(entity).insert(b.clone());
121 }
122
123 if !reader.is_empty() {
124 for (entity, c) in &c {
125 commands.entity(entity).insert(c.clone());
126 }
127 reader.clear();
128 }
129}More examples
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, M> Debug for MessageReader<'w, 's, M>
impl<'w, 's, M> Debug for MessageReader<'w, 's, M>
impl<'w, 's, M> ReadOnlySystemParam for MessageReader<'w, 's, M>where
M: Message,
Local<'s, MessageCursor<M>>: ReadOnlySystemParam,
Res<'w, Messages<M>>: ReadOnlySystemParam,
Source§impl<M> SystemParam for MessageReader<'_, '_, M>where
M: Message,
impl<M> SystemParam for MessageReader<'_, '_, M>where
M: Message,
Source§type Item<'w, 's> = MessageReader<'w, 's, M>
type Item<'w, 's> = MessageReader<'w, 's, M>
Self, instantiated with new lifetimes. Read moreSource§fn init_state(
world: &mut World,
) -> <MessageReader<'_, '_, M> as SystemParam>::State
fn init_state( world: &mut World, ) -> <MessageReader<'_, '_, M> as SystemParam>::State
State.Source§fn init_access(
state: &<MessageReader<'_, '_, M> as SystemParam>::State,
system_meta: &mut SystemMeta,
component_access_set: &mut FilteredAccessSet,
world: &mut World,
)
fn init_access( state: &<MessageReader<'_, '_, M> as SystemParam>::State, system_meta: &mut SystemMeta, component_access_set: &mut FilteredAccessSet, world: &mut World, )
Source§fn apply(
state: &mut <MessageReader<'_, '_, M> as SystemParam>::State,
system_meta: &SystemMeta,
world: &mut World,
)
fn apply( state: &mut <MessageReader<'_, '_, M> 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<'_, '_, M> as SystemParam>::State,
system_meta: &SystemMeta,
world: DeferredWorld<'_>,
)
fn queue( state: &mut <MessageReader<'_, '_, M> as SystemParam>::State, system_meta: &SystemMeta, world: DeferredWorld<'_>, )
ApplyDeferred.Source§unsafe fn get_param<'w, 's>(
state: &'s mut <MessageReader<'_, '_, M> as SystemParam>::State,
system_meta: &SystemMeta,
world: UnsafeWorldCell<'w>,
change_tick: Tick,
) -> Result<<MessageReader<'_, '_, M> as SystemParam>::Item<'w, 's>, SystemParamValidationError>
unsafe fn get_param<'w, 's>( state: &'s mut <MessageReader<'_, '_, M> as SystemParam>::State, system_meta: &SystemMeta, world: UnsafeWorldCell<'w>, change_tick: Tick, ) -> Result<<MessageReader<'_, '_, M> as SystemParam>::Item<'w, 's>, SystemParamValidationError>
SystemParamFunction. Read moreAuto Trait Implementations§
impl<'w, 's, M> !UnwindSafe for MessageReader<'w, 's, M>
impl<'w, 's, M> Freeze for MessageReader<'w, 's, M>
impl<'w, 's, M> RefUnwindSafe for MessageReader<'w, 's, M>where
M: RefUnwindSafe,
impl<'w, 's, M> Send for MessageReader<'w, 's, M>
impl<'w, 's, M> Sync for MessageReader<'w, 's, M>
impl<'w, 's, M> Unpin for MessageReader<'w, 's, M>
impl<'w, 's, M> UnsafeUnpin for MessageReader<'w, 's, M>
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
impl<T> ConditionalSend for Twhere
T: Send,
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
impl<S, T> Duplex<S> for Twhere
T: FromSample<S> + ToSample<S>,
impl<T> ErasedDestructor for Twhere
T: 'static,
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,
impl<T> HitDataExtra for T
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.impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
impl<T> Settings 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.