gpt4 book ai didi

rust - 如何使用泛型函数来减少重复代码

转载 作者:行者123 更新时间:2023-11-29 08:23:13 25 4
gpt4 key购买 nike

我有很多类似下面的代码:

let metadata = Some(meta::ObjectMeta {
name: Some(apple.name.clone()),
}),
let metadata = Some(meta::ObjectMeta {
name: Some(orange.name.clone()),
}),

我希望写一个像这样的通用函数:

fn get_meta<T>(args: T) -> Option<meta::ObjectMeta> {
Some(meta::ObjectMeta {
name: Some(args.name.clone()),
})
}
let metadata = get_meta(self);

但是我如何确保泛型类型 T 具有字段 name

最佳答案

引入泛型类型时T就像你一样,你不能用它做任何事情:你不能调用方法,不能访问字段等等。您只是对类型一无所知。向类型添加“特征”的唯一方法是通过特征边界,例如<T: Foo>如果Foo是一种特质。

因此,如果你想对行为进行抽象,你必须编写一个特征来捕捉这种行为。您的案例存在的问题是:traits 不允许指定字段。换句话说:你不能说“所有实现这个特征的类型都需要有字段 name”。但是,你当然可以只创建一个 getter 方法(在 Rust 中它通常被称为字段,没有 get ):

trait HasName {
fn name(&self) -> &str;
}

fn get_meta<T: HasName>(args: T) -> Option<meta::ObjectMeta> {
Some(meta::ObjectMeta {
name: Some(args.name().clone()),
})
}

使用 getter 方法而不是字段应该适用于基本上所有情况。


作为旁注:有 some early considerations关于向特征添加字段。不过,这个讨论还处于非常早期的阶段。甚至没有正式的 RFC,所以不要指望很快就会有这个功能。

关于rust - 如何使用泛型函数来减少重复代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57753976/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com