this post was submitted on 19 Jun 2023
4 points (100.0% liked)

Rust Programming

8191 readers
3 users here now

founded 5 years ago
MODERATORS
 

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 are viewing a single comment's thread
view the rest of the comments
[โ€“] refefer 5 points 1 year ago* (last edited 1 year ago) (1 children)

You reminded me of a deeply amusing story of solving the 4 queens problem with just the type system.

[โ€“] [email protected] 1 points 1 year ago* (last edited 1 year ago)

I was actually vaguely thinking that for playing cards, there's no actual way to do maths on it (like you can't add an Ace to a Jack, or a Joker to a Queen). Are Aces high? Is the 2 worth 2 points or something else? So maybe OP is better off just defining the ranks manually (A, 2, 3 ... J, Q K) and then separate out any points calculations. In that sense, OP might actually want the game rules encoded into the type system.

EDIT: Also, nice, I remember reading that story.