假设您有以下类型:
type Min = 1..4
您想检查某些 int 是否像集合一样落在 Min 内:
's' in {'a'..'z'}
可以比以下更优雅地表达它:
2 in {low(Min)..high(Min)} #Too many characters
2 in Min #Expecting this conciseness
如果你打破1..4作为类型的限制,这很容易实现。1..4作为一个值,它是 aSlice而不是 a range。我不知道你还能做什么Min,但作为一个切片,它in通过containsproc 支持语法:
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