在范围内
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
假设您有以下类型:
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