Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 访问泛型结构中的字段_Generics_Rust - Fatal编程技术网

Generics 访问泛型结构中的字段

Generics 访问泛型结构中的字段,generics,rust,Generics,Rust,给定此结构: pub struct A { pub C: B, } 我正在寻找使用A元素创建防锈容器,并在该通用防锈容器中访问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 ge

给定此结构:

pub struct A {
    pub C: B,
}
我正在寻找使用
A
元素创建防锈容器,并在该通用防锈容器中访问
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
    }
}
我想实例化一个泛型类型,如下所示:

设h:MyArray=MyArray(6)

设d:MyArray=MyArray(10)

然后,我希望能够调用
h.func(5)
以获取Rust容器第6个元素中指定字段的值


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

您可以将要访问的字段的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));
}

pub struct MyVec

您可以将要访问的字段的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));
}

pub struct MyVec

如果我猜对了,你想要什么是一种特质,但你的问题很不清楚,目前在
struct a
struct MyArray
之间没有联系。A也不是结构的合适名称。我相信您的问题已由的答案回答。如果你不同意,请用你的问题来解释不同之处。否则,我们可以将此问题标记为已回答。TL;重复博士:不,你不能访问通用结构中的字段。好的,编辑问题。这与特性案例有点不同,因为我需要实例化一个类型。@ SePMeMe:我的理解是OP在C++中寻找指向成员指针的东西。在C++中你可以实例化一个模板<代码> MyReals。如果你猜的话,你想要的是一个特性,但是你的问题很不清楚,在<代码>结构> < />代码>和<代码>结构MyLabe>代码>之间没有链接。A也不是结构的合适名称。我相信您的问题已由的答案回答。如果你不同意,请用你的问题来解释不同之处。否则,我们可以将此问题标记为已回答。TL;重复博士:不,你不能访问通用结构中的字段。好的,编辑问题。这与特性案例有点不同,因为我需要实例化一个类型。@ SePMeMe:我的理解是OP在C++中寻找指向成员指针的东西。在C++中,可以实例化模板<代码> MyReals。