Ich versuche, einen IP-Adresstyp zu implementieren, die im Grunde Wraps u32
implementieren:Wie std :: ops :: Index, wenn der Ausgabewert ist nicht Teil des Typs
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Address(u32);
Ich bin die Umsetzung der std::ops
Operatoren, die für eine IP-Adresse sinnvoll sind (&
, |
, +
, -
, usw.). Der einzige, der Probleme verursacht ist std::ops::Index
:
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Address(u32);
enum Byte {
A,
B,
C,
D
}
impl ops::Index<Byte> for Address {
type Output = u8;
fn index<'a>(&'a self, byte: Byte) -> &'a Self::Output {
match byte {
Byte::A => ((self.0 & 0xFF000000) >> 24) as u8,
Byte::B => ((self.0 & 0x00FF0000) >> 16) as u8,
Byte::C => ((self.0 & 0x0000FF00) >> 8) as u8,
Byte::D => (self.0 & 0x000000FF) as u8,
}
}
}
Das ist offensichtlich nicht kompilieren, weil ich kann keine u8
zurück, wenn &u8
erwartet wird. Der naive Versuch, es zu beheben wäre:
impl ops::Index<Byte> for Address {
type Output = u8;
fn index<'a>(&'a self, byte: Byte) -> &'a Self::Output {
match byte {
Byte::A => &(((self.0 & 0xFF000000) >> 24) as u8),
Byte::B => &(((self.0 & 0x00FF0000) >> 16) as u8),
Byte::C => &(((self.0 & 0x0000FF00) >> 8) as u8),
Byte::D => &((self.0 & 0x000000FF) as u8),
}
}
}
Aber natürlich kann ich nicht einen Verweis auf einen Wert zurückgeben, der nicht mehr, wenn die Funktion zurückkehrt vorhanden ist.
ich dort eine Möglichkeit zu implementieren std::ops::Index
in diesem Fall? Es scheint mir nicht so, aber ich hoffe, dass jemand mir das Gegenteil beweisen kann.
Auf die Gefahr hin, etwas offensichtlich zu verpassen, gibt es bereits eine ['Ipv4Addr'] (https://doc.rust-lang.org/std/net/struct.Ipv4Addr.html), die den entsprechenden zugrunde liegenden Typ umschließt. – Shepmaster
@Shempmaster, ja, aber ich möchte dies in einem Verkehrserzeugungstool verwenden, also möchte ich (mindestens) die '+', '&', '<<' and '>>' Operatoren implementiert. Afaik kann ich nicht einfach auf 'Ipv4Addr' implementieren, da ich keinen direkten Zugriff auf den zugrunde liegenden Typ habe. –