在范围内

Is inside range

假设您有以下类型:

type Min = 1..4

您想像使用集合一样检查某些整数是否落在 Min 内:

's' in {'a'..'z'}

可以用比以下更优雅的方式来表达:

2 in {low(Min)..high(Min)}  #Too many characters
2 in Min                    #Expecting this conciseness

如果你打破1..4是一个类型的限制,这很容易实现。 1..4 作为一个值使其成为 Slice 而不是 range。我不知道你还用 Min 做了什么,但作为一个切片,它通过 contains proc:

支持 in 语法
echo 2 in 1..4

let Min = 1..4
echo 2 in Min

您要处理的问题是 Min 是一种类型,而 in 运算符的右侧需要一个表达式。您可以通过将 in 运算符重载为接受类型参数的模板或通过提供模板将类型转换为基础范围表达式来处理此问题。

超载in:

type Min = 1..4

template `in`[T](x: T, tp: typedesc[range]): bool =
  x in (tp.low .. tp.high)

echo 2 in Min

将类型转换为范围:

type Min = 1..4

template rg(tp: typedesc[range]): expr =
  tp.low .. tp.high

echo 2 in rg Min