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.

0
NutellaFan 1 listopad 2018, 04:56

1 odpowiedź

Najlepsza 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));
}

Plac zabaw

2
Shepmaster 2 listopad 2018, 00:02