rust - 将结构作为参数的通用函数?
问题描述
struct Item1 {
a: u32,
}
struct Item2 {
a: u32,
b: u32,
}
fn some_helper_function(item: Item1) {
// Basically `item` could be of type `Item1` or `Item2`.
// How I create generic function to take any one of them?
// Some implementation goes here.
}
如何创建一个泛型some_helper_function
函数,其参数可以具有多个派生数据类型,例如Item2
or Item1
?
解决方案
在您的示例中, and 之间没有关系Item1
,Item2
并且 Rust 的泛型不是鸭子类型,就像 C++ 模板或 Python 函数一样。
如果您希望一个函数适用于多种类型,通常的方法是使其具有通用性,并具有一些定义这些类型共同点的特征:
trait HasA {
fn get_a(&self) -> u8;
}
impl HasA for Item1 {
fn get_a(&self) -> u8 {
self.a
}
}
impl HasA for Item2 {
fn get_a(&self) -> u8 {
self.a
}
}
fn some_helper_function<T: HasA>(item: T) {
println!("The value of `item.a` is {}", item.get_a());
}
有一个提议将字段添加到特征,这将允许您item.a
从泛型中使用(您仍然必须为每种类型实现特征)。但它已被推迟。该提案似乎收效甚微,有些问题没有得到解决,而且没有被视为优先事项。
推荐阅读
- kubernetes - 如何在 kubernetes 集群上修补 statefulset 并设置 imagePullPolicy
- angular - 如何使用参数实例化 Angular 组件?
- windows - windows中注册的所有window proc在哪里
- python - 在 dialogflow api v2 版本中出现非英语语言(如俄语)的错误
- sql-server - 如何防止 SQL 文件打开 SSMS 17.9.1 的新实例?
- javascript - 在网页中进行两次重定向
- javascript - 如何在 WebGl 中使用漫反射照明进行 Gouraud 着色?
- c# - 无法在 Visual Studio C# Windows 应用程序项目中添加 .mdf 文件
- sql-server - SQL Server 自动为 json 生成 camelCase(例如,使用 JSON_QUERY 时)
- javascript - 使用 D3 进行 DOM 操作有什么优势吗?