我正试图从Haskell的书中取出一页纸,并使用Rust类型系统来确保坐标系中使用的值保持在一定范围内,并在编译时捕获超出范围的错误。
想象一个像这样的坐标对类型:
struct Coordinates {
x: i64,
y: i64,
}
使用这样的系统,任何有效的64位带符号整数都可以占据我的坐标系,而不仅仅是0-50
。我可以在使用这种类型的整个过程中检查代码,以确保坐标保持在“有效”范围内,但是这里的问题必须在运行时而不是编译时发现,并且有可能我会错过一些棘手的问题潜入无效值的方法。
当然,这是一个令人费解的示例,但可以想象一下,如果不是地图上的坐标,这些是RAM卡上的内存地址。突然有能力将值潜入超出允许范围的混乱可能会带来灾难性的安全后果,那么为什么不在编译时解决此问题呢?
相反,我想做这样的事情,在编译时动态生成有界的类型:
struct Coordinates {
x: i64bounded!(-50, 100),
y: i64bounded!(-25, 75),
}
现在,我知道为了使这种类型起作用,我需要重载所有数学运算符以添加边界检查,并且例如,如果变量逃脱了边界,则以某种方式将其标记为非法,这样编译器将抱怨。真正的问题归结于数学闭包。用户提交的值有可能导致类型错误的想法可能需要使用可选方法将变量标记为无效,所有以后的步骤都将拒绝使用None
可选值。
有可能在Rust中做这样的事情吗?您将如何去做?