首页 > 解决方案 > 将结构作为参数的通用函数?

问题描述

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函数,其参数可以具有多个派生数据类型,例如Item2or Item1

标签: rust

解决方案


在您的示例中, and 之间没有关系Item1Item2并且 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从泛型中使用(您仍然必须为每种类型实现特征)。但它已被推迟。该提案似乎收效甚微,有些问题没有得到解决,而且没有被视为优先事项。


推荐阅读