gpt4 book ai didi

rust - 我怎样才能拥有一个仅用于其内部常量的结构?

转载 作者:行者123 更新时间:2023-11-29 08:03:28 26 4
gpt4 key购买 nike

我需要在 Rust 类型系统中封装常量。理想情况下,RFC2000已经准备好了,但在没有它的情况下,由于我只需要一组有限的常量,我可以实现一些接近我需要的东西:

trait U32Const {
const VAL: u32;
}

struct U32Const10;
impl U32Const for U32Const10 {
const VAL: u32 = 10;
}

struct MyType<X: U32Const> {
val: u32,
template: X,
}

impl<X: U32Const> MyType<X> {
fn do_something(&self) -> u32 {
self.val * X::VAL
}
}

fn main() {
let a = MyType::<U32Const10> {
val: 20,
template: U32Const10 {},
};
println!("{}", a.do_something());
}

这会打印出200根据需要 - 也就是说,常量值来自 main 内实例化时传入的类型。 .

现在,这有点棘手,因为它需要 X 的实例在结构中创建,我称之为 template ,然后未使用它,因此我收到编译器警告。

如果删除 template字段,这是理想的 API,那么编译器会提示未使用的参数 Xstruct MyType < X: U32Const > 。如果我去掉 X参数 struct MyType ,然后我得到一个 unexpected type argumentMyTypeimpl block 。

有什么方法可以做我想做的事情,让编译器满意吗?实际上,我想要一个用于其内部的结构 const .

最佳答案

不用将幻像变量赋予结构,使用关联类型可能会达到目的,

trait U32Const {
type U32;
const VAL: Self::U32;
}

struct U32Const10;

impl U32Const for U32Const10 {
type U32 = u32;
const VAL: Self::U32 = 10;
}

struct MyType<X: U32Const> {
val: X::U32,
}

impl<X: U32Const<U32 = u32>> MyType<X> {
fn do_something(&self) -> X::U32 {
self.val * X::VAL
}
}

fn main() {
let a = MyType::<U32Const10> { val: 20 };
println!("{}", a.do_something());
}

Playground (具有多个 const 实现)

关于rust - 我怎样才能拥有一个仅用于其内部常量的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58286148/

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