Biorąc pod uwagę ten struktura:
pub struct A {
pub C: B,
}
Szukam utworzyć kontener Rust z elementami A
i uzyskać dostęp do A.C
w tym ogólnym kontenerze Rust. Oto taki pojemnik:
pub struct MyArray<A, C> {
data: Vec<A>,
size: usize,
}
impl<A, C> MyArray {
// Access the value in the ith element of data
pub fn get_value(self, i: u64) -> u64 {
self.data[i].C
}
}
Biorąc pod uwagę następujące struct:
pub struct House {
pub num_rooms: u64,
}
Chcę utworzyć wystąpienie typów ogólnych, takich jak:
let h: MyArray<House, num_rooms> = MyArray(6);
let d: MyArray<Cat, num_lives> = MyArray(10);
Następnie chcę móc wywołać h.func(5)
, aby uzyskać wartość określonego pola w 6 elemencie kontenera Rust.
Nie jestem pewien, czy to w ogóle możliwe. Jeśli tak, prawdopodobnie potrzebne są makra / generyki.
1 odpowiedź
Możesz przechowywać funkcję pobierającą dla pola, do którego chcesz uzyskać dostęp, obok kontenera, np.
pub struct MyVec<A, G> {
data: Vec<A>,
getter: G,
}
impl<A, G, T> MyVec<A, G>
where
G: Fn(&A) -> T,
{
pub fn get_value(&self, i: usize) -> T {
(self.getter)(&self.data[i])
}
}
struct Wobble {
gloink: u64,
}
impl Wobble {
fn gloink(&self) -> u64 {
self.gloink
}
}
fn main() {
let v = MyVec {
data: vec![Wobble { gloink: 42 }],
getter: Wobble::gloink,
};
println!("{}", v.get_value(0));
}
Podobne pytania
Powiązane pytania
Nowe pytania
generics
Typy generyczne to forma polimorfizmu parametrycznego występująca w wielu językach, w tym w językach .NET, Javie, Swift i Rust.