generics - 根据参数值返回不同类型的通用函数

标签 generics rust dependent-type

我有一个保存寄存器的结构。我希望我的 read_register 函数为 Register::V0Register::V1 返回一个 u8u16 用于 Register::V2Register::V3。我不确定如何使函数在返回类型上通用。我收到错误 match arms have incompatible types 这确实有意义,因为类型不同。

struct Registers {
    v0: u8,
    v1: u8,
    v2: u16,
    v3: u16,
}

enum Register {
    V0,
    V1,
    V2,
    V3,
}

impl Registers {
    fn read_register<T>(&self, register: Register) -> T {
        match register {
            Register::V0 => self.v0,
            Register::V1 => self.v1,
            Register::V2 => self.v2,
            Register::V3 => self.v3,
        }
    }
}

最佳答案

你不能。

抱歉,在 Rust 中无法做到这一点。您需要依赖类型,而 Rust 没有。您或许可以返回一个 enum 的实例,它只包含两个变体(每种类型一个)。或者您可以为每个“路径”接受一个回调,让调用者决定如何解决问题。

fn read_register<FnU8, FnU16, R>(
    &self,
    register: Register,
    with_u8: FnU8,
    with_u16: FnU16,
) -> R
where
    FnU8: FnOnce(u8) -> R,
    FnU16: FnOnce(u16) -> R,
{
    match register {
        Register::V0 => with_u8(self.v0),
        Register::V1 => with_u8(self.v1),
        Register::V2 => with_u16(self.v2),
        Register::V3 => with_u16(self.v3),
    }
}

关于generics - 根据参数值返回不同类型的通用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43816946/

相关文章:

c# - C# : making the output type depend on the input value 中的依赖类型

swift - 使用泛型在 Swift 中实现类似 registerClass 的行为

java - 类的实例等于接口(interface)的实例吗?

java - 如何使用 Spring 4 Autowiring 泛型类?

rust - Rust-如何返回其他函数的错误?

dependent-type - 如何在 Idris 中将数字范围指定为类型?

idris - 编译器能否在 Idris 中隐式地找到证明?

generics - 接受受多个特征中的任何一个约束的参数的函数

rust - 在 Rust 中与闭包和生命周期作斗争

error-handling - 如何将 rust Try trait 与 Option NoneError 一起使用?