Tuples, Sets and Enums
10.1 Tuples
Tuples are structurally typed: same field names and types mean the same type.
let p = (name: "Ana", age: 30) # named tuple
echo p.name, p[1]
let (n, a) = p # unpacking
type Person = tuple[name: string, age: int]
let anon = (1, "x", 2.0) # anonymous tuple10.2 Enums
{.pure.} enums require qualification (Color.Red). In Nim 2, enums are overloadable, so ambiguous names can be qualified.
holey enums (with gaps) can't be iterated safely.
type
Color = enum
Red, Green, Blue
Status = enum
sOk = "ok", sError = "error" # custom string representation
HttpCode = enum
hc200 = 200, hc404 = 404
echo Red, " ", ord(Blue), " ", $sError, " ", Color.high, " ", succ(Red)
for c in Color: echo c
echo parseEnum[Color]("Green") # std/strutils10.3 Sets (Bit Sets of Ordinal Types)
Built-in sets are limited to small ordinals (≤ 2^16 elements). For general hash sets, use std/sets (HashSet, OrderedSet).
type Perm = enum pRead, pWrite, pExec
var perms: set[Perm] = {pRead, pWrite}
perms.incl pExec
perms.excl pWrite
echo pRead in perms, perms.card
let vowels = {'a', 'e', 'i', 'o', 'u'}
echo {1, 2, 3} + {3, 4}, {1, 2, 3} * {2, 3}, {1, 2, 3} - {1} # union, intersection, difference
echo {1, 2} <= {1, 2, 3} # subset