访问通用结构中的字段

时间:2018-11-01 01:56:06

标签: generics rust

给出此结构:

pub struct A {
    pub C: B,
}

我正在寻找使用A元素创建Rust容器,并在该通用Rust容器中访问A.C。这是一个这样的容器:

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)来获取Rust容器的第6个元素中指定字段的值。

我不确定这是否可能。如果是这样,则可能需要宏/泛型。

1 个答案:

答案 0 :(得分:2)

您可以在容器旁边存储要访问的字段的getter函数,例如

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

Playground