Makrolardaki uygulamaları tanımlarken, ek bir argüman olarak iletmekten kaçınmak için bir yapı üyeleri türüne erişmek yararlı olabilir.İşlev imzaları veya bildirimleri için yapı üyesi türüne erişmek mümkün mü?
impl PartialEq<u32> for MyStruct { ... }
onun türünü önceden bilmeden bir yapı elemanının türü erişmek için bir yolu var mı (this question bakınız)?
durumda yararlıdır? Inimpl PartialEq<typeof(MyStruct.member)> for MyStruct { ... }
, bu bunu yapmak ilgileniyorum neden kısaltılmış örneğidir:
struct_bitflag_impl!(
pub struct MyFlag(u8);,
MyFlag, u8);
// ^^ how to avoid having this extra arg?
// (Used by ``impl PartialEq<$t_internal> for $p``)
// couldn't it be discovered from `MyFlag.0` ?
// the macro
macro_rules! struct_bitflag_impl {
($struct_p_def: item, $p:ident, $t_internal:ty) => {
#[derive(PartialEq, Eq, Copy, Clone, Debug)]
$struct_p_def
impl ::std::ops::BitAnd for $p {
type Output = $p;
fn bitand(self, _rhs: $p) -> $p { $p(self.0 & _rhs.0) }
}
impl ::std::ops::BitOr for $p {
type Output = $p;
fn bitor(self, _rhs: $p) -> $p { $p(self.0 | _rhs.0) }
}
impl ::std::ops::BitXor for $p {
type Output = $p;
fn bitxor(self, _rhs: $p) -> $p { $p(self.0^_rhs.0) }
}
impl ::std::ops::Not for $p {
type Output = $p;
fn not(self) -> $p { $p(!self.0) }
}
// support comparison with the base-type.
impl PartialEq<$t_internal> for $p {
fn eq(&self, other: &t_internal) -> bool {
self.0 == *other
}
}
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// How to avoid using 't_internal' here?
}
}
@keepr'den alınan yorum, bu 'custom_derive' tarafından ele alınabilir: https://docs.rs/custom_derive/*/custom_derive/index.html – ideasman42