gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:12:27 24 4
gpt4 key购买 nike

我有一个保存寄存器的结构。我希望我的 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/

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