Struct qsym2::symmetry::symmetry_element::SymmetryElement
source · pub struct SymmetryElement { /* private fields */ }
Expand description
Structure for storing and managing symmetry elements.
Each symmetry element is a geometrical object in $\mathbb{R}^3
$ that encodes the following
pieces of information:
- the axis of rotation $
\hat{\mathbf{n}}
$, - the angle of rotation $
\phi
$, - the associated improper operation, if any, and
- the associated antiunitary operation, if any.
These pieces of information can be stored in the following representation of a symmetry element
$\hat{g}
$:
\hat{g} = \hat{\alpha} \hat{\gamma} \hat{C}_n^k,
where
- $
n \in \mathbb{N}_{+}
$, $k \in \mathbb{Z}/n\mathbb{Z}
$ such that $\lfloor -n/2 \rfloor < k \le \lfloor n/2 \rfloor
$, - $
\hat{\gamma}
$ is either the identity $\hat{e}
$, the inversion operation $\hat{i}
$, or a reflection operation $\hat{\sigma}
$ perpendicular to the axis of rotation, - $
\hat{\alpha}
$ is either the identity $\hat{e}
$, the complex conjugation $\hat{K}
$, or the time reversal $\hat{\theta}
$.
With this definition, the above pieces of information required to specify a geometrical symmetry element are given as follows:
- the axis of rotation $
\hat{\mathbf{n}}
$ is given by the axis of $\hat{C}_n^k
$, - the angle of rotation $
\phi = 2\pi k/n \in (-\pi, \pi]
$, - the improper contribution $
\hat{\gamma}
$, - the antiunitary contribution $
\hat{\alpha}
$.
This definition also allows the unitary part of $\hat{g}
$ to be interpreted as an element of
either $\mathsf{O}(3)
$ or $\mathsf{SU}'(2)
$, which means that the unitary part of
$\hat{g}
$ is also a symmetry operation in the corresponding group, and a rather special one
that can be used to generate other symmetry operations of the group. $\hat{g}
$ thus serves as
a bridge between molecular symmetry and abstract group theory.
There is one small caveat: for infinite-order elements, $n
$ and $k
$ can no longer be used
to give the angle of rotation. There must thus be a mechanism to allow for infinite-order
elements to be interpreted as an arbitrary finite-order one. An explicit specification of the
angle of rotation $\phi
$ seems to be the best way to do this. In other words, the angle of
rotation of each element is specified by either a tuple of integers $(k, n)
$ or a
floating-point number $\phi
$.
Implementations§
source§impl SymmetryElement
impl SymmetryElement
sourcepub fn builder() -> SymmetryElementBuilder
pub fn builder() -> SymmetryElementBuilder
Returns a builder to construct a new symmetry element.
§Returns
A builder to construct a new symmetry element.
sourcepub fn raw_proper_order(&self) -> &ElementOrder
pub fn raw_proper_order(&self) -> &ElementOrder
Returns the raw order of the proper rotation. This might not be equal to the value of $n
$
if the fraction $k/n
$ has been reduced.
sourcepub fn raw_proper_power(&self) -> Option<&i32>
pub fn raw_proper_power(&self) -> Option<&i32>
Returns the raw power of the proper rotation. This might not be equal to the value of $k
$
if the fraction $k/n
$ has been reduced.
sourcepub fn standard_positive_axis(&self) -> Vector3<f64>
pub fn standard_positive_axis(&self) -> Vector3<f64>
Returns the axis of the proper rotation in the standard positive hemisphere.
sourcepub fn signed_axis(&self) -> Vector3<f64>
pub fn signed_axis(&self) -> Vector3<f64>
Returns the axis of the proper rotation multiplied by the sign of the rotation angle. If the proper rotation is a binary rotation, then the positive axis is always returned.
sourcepub fn proper_rotation_pole(&self) -> Vector3<f64>
pub fn proper_rotation_pole(&self) -> Vector3<f64>
Returns the pole of the proper rotation part of the element while leaving any improper and antiunitary contributions intact.
If the proper rotation part if a binary rotation, the pole is always in the standard positive hemisphere.
§Returns
The position vector of the proper rotation pole.
sourcepub fn proper_fraction(&self) -> Option<&GenericFraction<u32>>
pub fn proper_fraction(&self) -> Option<&GenericFraction<u32>>
Returns the proper fraction for this element, if any.
The element lacks a proper fraction if it is infinite-order.
sourcepub fn proper_angle(&self) -> Option<f64>
pub fn proper_angle(&self) -> Option<f64>
Returns the proper angle for this element, if any.
The element lacks a proper angle if it is infinite-order and the rotation angle has not been set.
sourcepub fn kind(&self) -> &SymmetryElementKind
pub fn kind(&self) -> &SymmetryElementKind
Returns the spatial and antiunitary kind of this element.
sourcepub fn rotation_group(&self) -> &RotationGroup
pub fn rotation_group(&self) -> &RotationGroup
Returns the rotation group and possibly the identity-connected homotopy class in which the proper rotation part of this element is to be interpreted.
sourcepub fn is_generator(&self) -> bool
pub fn is_generator(&self) -> bool
Returns a boolean indicating if the element is a generator of a group.
sourcepub fn contains_time_reversal(&self) -> bool
pub fn contains_time_reversal(&self) -> bool
Checks if the symmetry element contains a time-reversal operator as the antiunitary part.
§Returns
A boolean indicating if the symmetry element contains a time-reversal operator as the antiunitary part.
sourcepub fn contains_antiunitary(&self) -> Option<AntiunitaryKind>
pub fn contains_antiunitary(&self) -> Option<AntiunitaryKind>
Checks if the symmetry element contains an antiunitary part.
§Returns
Returns None
if the symmetry element has no antiunitary parts, or Some
wrapping around
the antiunitary kind if the symmetry element contains an antiunitary part.
sourcepub fn is_su2(&self) -> bool
pub fn is_su2(&self) -> bool
Checks if the proper rotation part of the element is in $\mathsf{SU}(2)
$.
sourcepub fn is_su2_class_1(&self) -> bool
pub fn is_su2_class_1(&self) -> bool
Checks if the proper rotation part of the element is in $\mathsf{SU}(2)
$ and connected to
the identity via a homotopy path of class 1.
See S.L. Altmann, Rotations, Quaternions, and Double Groups (Dover Publications, Inc., New York, 2005) for further information.
sourcepub fn is_o3_proper(&self, au: Option<AntiunitaryKind>) -> bool
pub fn is_o3_proper(&self, au: Option<AntiunitaryKind>) -> bool
sourcepub fn is_o3_identity(&self, au: Option<AntiunitaryKind>) -> bool
pub fn is_o3_identity(&self, au: Option<AntiunitaryKind>) -> bool
Checks if the symmetry element is spatially an identity element and has the specified antiunitary attribute.
§Arguments
au
- AnOption
for the desired antiunitary kind.
§Returns
A boolean indicating if this symmetry element is spatially an identity element and has the specified antiunitary attribute.
sourcepub fn is_o3_inversion_centre(&self, au: Option<AntiunitaryKind>) -> bool
pub fn is_o3_inversion_centre(&self, au: Option<AntiunitaryKind>) -> bool
sourcepub fn is_o3_binary_rotation_axis(&self, au: Option<AntiunitaryKind>) -> bool
pub fn is_o3_binary_rotation_axis(&self, au: Option<AntiunitaryKind>) -> bool
Checks if the symmetry element is spatially a binary rotation axis and has the specified antiunitary attribute.
§Arguments
au
- AnOption
for the desired antiunitary kind.
§Returns
A boolean indicating if this symmetry element is spatially a binary rotation axis and has the specified antiunitary attribute.
sourcepub fn is_o3_mirror_plane(&self, au: Option<AntiunitaryKind>) -> bool
pub fn is_o3_mirror_plane(&self, au: Option<AntiunitaryKind>) -> bool
sourcepub fn get_full_symbol(&self) -> String
pub fn get_full_symbol(&self) -> String
Returns the full symbol for this symmetry element, which does not classify certain improper rotation axes into inversion centres or mirror planes, but which does simplify the power/order ratio, and which displays only the absolute value of the power since symmetry elements do not distinguish senses of rotations since rotations of oposite directions are inverses of each other, both of which must exist in the group.
Some additional symbols that can be unconventional include:
θ
: time reversal,(Σ)
: the spatial part is in homotopy class 0 of $\mathsf{SU}'(2)
$,(QΣ)
: the spatial part is in homotopy class 1 of $\mathsf{SU}'(2)
$.
See RotationGroup
for further information.
§Returns
The full symbol for this symmetry element.
sourcepub fn get_simplified_symbol(&self) -> String
pub fn get_simplified_symbol(&self) -> String
Returns the simplified symbol for this symmetry element, which classifies special symmetry elements (identity, inversion centre, time reversal, mirror planes), and which simplifies the power/order ratio and displays only the absolute value of the power since symmetry elements do not distinguish senses of rotations, as rotations of oposite directions are inverses of each other, both of which must exist in the group.
§Returns
The simplified symbol for this symmetry element.
sourcepub fn get_simplified_symbol_signed_power(&self) -> String
pub fn get_simplified_symbol_signed_power(&self) -> String
Returns the simplified symbol for this symmetry element, which classifies special symmetry elements (identity, inversion centre, mirror planes), and which simplifies the power/order ratio and displays only the absolute value of the power since symmetry elements do not distinguish senses of rotations. Rotations of oposite directions are inverses of each other, both of which must exist in the group.
§Returns
The simplified symbol for this symmetry element.
sourcepub fn convert_to_improper_kind(
&self,
improper_kind: &SymmetryElementKind,
preserves_power: bool,
) -> Self
pub fn convert_to_improper_kind( &self, improper_kind: &SymmetryElementKind, preserves_power: bool, ) -> Self
Returns a copy of the current improper symmetry element that has been converted to the
required improper kind. For $\mathsf{SU}'(2)
$ elements, the conversion will be carried
out in the same homotopy class.
To convert between the two improper kinds, we essentially seek integers
$n, n' \in \mathbb{N}_{+}
$ and $k \in \mathbb{Z}/n\mathbb{Z}
$,
$k' \in \mathbb{Z}/n'\mathbb{Z}
$, such that
\sigma C_n^k = i C_{n'}^{k'},
where the axes of all involved elements are parallel. By noting that
$\sigma = i C_2
$ and that $k
$ and $k'
$ must have opposite signs, we can easily show
that, for $k \ge 0, k' < 0
$,
\begin{aligned}
n' &= \frac{2n}{\operatorname{gcd}(2n, n - 2k)},\\
k' &= -\frac{n - 2k}{\operatorname{gcd}(2n, n - 2k)},
\end{aligned}
whereas for $k < 0, k' \ge 0
$,
\begin{aligned}
n' &= \frac{2n}{\operatorname{gcd}(2n, n + 2k)},\\
k' &= \frac{n + 2k}{\operatorname{gcd}(2n, n + 2k)}.
\end{aligned}
The above relations are self-inverse. It can be further shown that
$\operatorname{gcd}(n', k') = 1
$. Hence, for symmetry element conversions, we can simply
take $k' = 1
$. This is because a symmetry element plays the role of a generator, and the
coprimality of $n'
$ and $k'
$ means that $i C_{n'}^{1}
$ is as valid a generator as
$i C_{n'}^{k'}
$.
§Arguments
improper_kind
- The improper kind to whichself
is to be converted. There is no need to make sure the time reversal specification inimproper_kind
matches that ofself
as the conversion will take care of this.preserves_power
- Boolean indicating if the proper rotation power $k'
$ should be preserved or should be set to $1
$.
§Returns
A copy of the current improper symmetry element that has been converted.
§Panics
Panics when self
is not an improper element, or when improper_kind
is not one of the
improper variants.
sourcepub fn to_su2(&self, normal: bool) -> Option<Self>
pub fn to_su2(&self, normal: bool) -> Option<Self>
Convert the proper rotation of the current element to one in $\mathsf{SU}(2)
$.
§Arguments
normal
- A boolean indicating whether the resultant $\mathsf{SU}(2)
$ proper rotation is of homotopy class 0 (true
) or 1 (false
) when connected to the identity.
§Returns
A symmetry element in $\mathsf{SU}(2)
$, or None
if the current symmetry element
is already in $\mathsf{SU}(2)
$.
sourcepub fn closeness_to_cartesian_axes(&self) -> (f64, usize)
pub fn closeness_to_cartesian_axes(&self) -> (f64, usize)
The closeness of the symmetry element’s axis to one of the three space-fixed Cartesian axes.
§Returns
A tuple of two values:
- A value $
\gamma \in [0, 1-1/\sqrt{3}]
$ indicating how close the axis is to one of the three Cartesian axes. The closer $\gamma
$ is to $0
$, the closer the alignment. - An index for the closest axis:
0
for $z
$,1
for $y
$,2
for $x
$.
§Panics
Panics when $\gamma
$ is outside the required closed interval $[0, 1-1/\sqrt{3}]
$ by
more than the threshold value in self
.
Trait Implementations§
source§impl Clone for SymmetryElement
impl Clone for SymmetryElement
source§fn clone(&self) -> SymmetryElement
fn clone(&self) -> SymmetryElement
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl Debug for SymmetryElement
impl Debug for SymmetryElement
source§impl<'de> Deserialize<'de> for SymmetryElement
impl<'de> Deserialize<'de> for SymmetryElement
source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
source§impl Display for SymmetryElement
impl Display for SymmetryElement
source§impl Hash for SymmetryElement
impl Hash for SymmetryElement
source§impl PartialEq for SymmetryElement
impl PartialEq for SymmetryElement
source§fn eq(&self, other: &Self) -> bool
fn eq(&self, other: &Self) -> bool
Two symmetry elements are equal if and only if the following conditions are all satisfied:
- they are both in the same rotation group and belong to the same homotopy class;
- they are both proper or improper;
- they both have the same antiunitary properties;
- their axes are either parallel or anti-parallel;
- their proper rotation angles have equal absolute values.
For improper elements, proper rotation angles are taken in the inversion centre convention.
Thus, symmetry element equality is less strict than symmetry operation equality. This is so that parallel or anti-parallel symmetry elements with the same spatial and time-reversal parities and angle of rotation are deemed identical, thus facilitating symmetry detection where one does not yet care much about directions of rotations.
source§impl Serialize for SymmetryElement
impl Serialize for SymmetryElement
impl Eq for SymmetryElement
Auto Trait Implementations§
impl Freeze for SymmetryElement
impl RefUnwindSafe for SymmetryElement
impl Send for SymmetryElement
impl Sync for SymmetryElement
impl Unpin for SymmetryElement
impl UnwindSafe for SymmetryElement
Blanket Implementations§
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
source§default unsafe fn clone_to_uninit(&self, dst: *mut T)
default unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)§impl<T> Conv for T
impl<T> Conv 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.§impl<T> FmtForward for T
impl<T> FmtForward for T
§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.§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.§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.§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.§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.§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.§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.§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.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§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 more§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§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 more§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 more§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
§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
§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.§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.§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> Pointable for T
impl<T> Pointable for T
§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self
from the equivalent element of its
superset. Read more§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self
is actually part of its subset T
(and can be converted to it).§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset
but without any property checks. Always succeeds.§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self
to the equivalent element of its superset.§impl<T> Tap for T
impl<T> Tap for T
§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 more§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 more§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 more§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 more§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 more§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 more§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.§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.§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.§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.§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.§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.§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.