gpt4 book ai didi

types - 你如何在 Rust 中指定值约束?

转载 作者:行者123 更新时间:2023-12-04 11:22:39 25 4
gpt4 key购买 nike

我正在寻找一种将类型约束移动到某种包装器中的方法。例如,在 Ada 中,您可能会看到如下内容:

type Element is Integer range 100 .. 1000;
这是定义一个新类型 Element那 --- 虽然仍然是一个 Integer --- 绑定(bind)到一个特定的范围。还有 mod这将循环回( super 有用)。
在 Rust 中,到目前为止,我一直在我的所有函数中手动检查这一点,即:
if x < 100 || x >= 1000 {
// throw some kind of error
}
但是最好定义一个新类型,在赋值时为我执行此检查,类似于默认情况下整数不能溢出的方式。我知道我们没有继承,但也许我可以实现某种特征?
TL;博士:我确定我的方法不是最佳实践,但标准的替代方法是什么?

最佳答案

But it would be really nice to instead define a new type that performs this check for me on assignment, similar to how integers can't overflow by default.


这确实是最好的。
您可以将其定义为用户类型:
struct BoundedU16<const MIN: u16, const MAX: u16>(u16);
然后定义您期望的所有方法,从 new 开始:
impl<const MIN: u16, const MAX: u16> BoundedU16<MIN, MAX> {
pub const fn new(value: u16) -> Result<Self, BoundError> {
if value >= MIN && value <= MAX {
Ok(Self(value))
} else {
Err(BoundError(value, MIN, MAX))
}
}
}
主要的缺点是目前你不能拥有 BoundedInteger<T, const MIN: T, const MAX: T> .解决方法是使用宏定义多个 Bounded[I|U][8|16|32|64|size] .
然后你可以声明 type Element = BoundedU16<100, 1000>; .
虽然请注意任何 Element在这里只是一个别名,不是新类型。如果你用 struct Element(BoundedU16<100, 1000>) 声明一个新类型然后您需要再次实现(或派生)所有特征。

特征将允许您添加 validate方法,但不允许您实现 Add , Sub , ... 自动 validate .这是一个更糟糕的解决方案。

关于types - 你如何在 Rust 中指定值约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69119046/

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