给出此结构:
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个元素中指定字段的值。
我不确定这是否可能。如果是这样,则可能需要宏/泛型。
答案 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));
}