Im Moment erfordert die Implementierung der std::ops::IndexMut
Eigenschaft auf einen Typ in Rust, dass ich auch die std::ops::Index
Eigenschaft implementieren. Die Körper dieser Implementierungen sind am Ende praktisch identisch. Zum Beispiel:So vermeiden Sie redundanten Code bei der Implementierung von Index und IndexMut in Rust
use std::ops::{Index, IndexMut};
enum IndexType {
A,
B,
}
struct Indexable {
a: u8,
b: u8,
}
impl Index<IndexType> for Indexable {
type Output = u8;
fn index<'a>(&'a self, idx: IndexType) -> &'a u8 {
match idx {
IndexType::A => &self.a,
IndexType::B => &self.b,
}
}
}
impl IndexMut<IndexType> for Indexable {
fn index_mut<'a>(&'a mut self, idx: IndexType) -> &'a mut u8 {
match idx {
IndexType::A => &mut self.a,
IndexType::B => &mut self.b,
}
}
}
fn main() {}
Dies funktioniert, und natürlich für trivial Typen ist dies kein ernstes Problem, aber für komplexere Typen mit interessanter Indizierung wird dies schnell mühsam und fehleranfällig. Ich kratze mich am Kopf und versuche einen Weg zu finden, diesen Code zu vereinheitlichen, aber nichts springt mir entgegen, und trotzdem muss ich ein Weg sein, dies zu tun, ohne im Wesentlichen kopieren und einfügen zu müssen. Irgendwelche Vorschläge? Was vermisse ich?
Siehe diese Diskussion https://internals.rust-lang.org/t/parametrisierung-over-mutability/235, – malbarbo