Say I want to have a struct called Tile that will have a suit (let it be a string for simplicity’s sake) and a number. This number can only exist in the range of 1-9.
In Nim, for example, you can do something like this:
type
Tile = object
suit: string
num: range[1..10]
var t = Tile(suit: "test", num: 9)
echo t.num # 9
t.num += 2 # OverflowDefect
How can I do such a thing in Rust? I can only think of one way: not allowing the number to be out of range in the “new” constructor and then adding auxiliary methods (add, sub, etc.) that do bounds checking. This solution seems too complex, though. There might be a way to do this using various range traits, but I can’t seem to figure out how.
You’ll notice that new is not a keyword or any special rust thing. It’s actually a software design pattern called a smart constructor, and validation is part of the intent. Pattern wise putting this into a smart constructor and encapsulating changes to this value is, I believe, idiomatic.
IIUC rust does not have a type system where you can give numeric bounds. Creating one would likely mean you’d need to define all the maths, which is likely not worth it.
You reminded me of a deeply amusing story of solving the 4 queens problem with just the type system.
There are crates that help remove the boilerplate. One I’ve used is called bounded-integer
deleted by creator