Доступ к полю в общей структуре - PullRequest
0 голосов
/ 01 ноября 2018

Учитывая эту структуру:

pub struct A {
    pub C: B,
}

Я ищу создать контейнер Rust с элементами A и доступ к A.C в этом универсальном контейнере Rust. Вот такой контейнер:

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
    }
}

Учитывая следующую структуру:

pub struct House {
    pub num_rooms: u64, 
} 

Я хочу создать общие типы, подобные этому:

let h: MyArray<House, num_rooms> = MyArray(6);

let d: MyArray<Cat, num_lives> = MyArray(10);

Тогда я хочу иметь возможность вызвать h.func(5), чтобы получить значение указанного поля в 6-м элементе контейнера Rust.

Я не уверен, возможно ли это вообще. Если это так, возможно, нужны макросы / генерики.

1 Ответ

0 голосов
/ 01 ноября 2018

Вы можете сохранить функцию получения для поля, к которому хотите получить доступ, рядом с вашим контейнером, например,

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

Детская площадка

...