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.

  • bbaldino
    link
    fedilink
    English
    arrow-up
    1
    ·
    1 year ago

    As far as I know, these are referred to as refinement/range/pattern types. There’s some official discussion here (nothing in the language yet). There’s a library called flux though that implements a form of it