echo 0.isNil
Run Code Online (Sandbox Code Playgroud)
类型不匹配:得到 <
intliteral (0)>但预期为以下之一:proc isNil[T: proc](x: T): bool
proc isNil[T](x: ptr T): bool
proc isNil(x: cstring) : bool
proc isNil(x: 指针): bool
proc isNil(x: string): bool
proc isNil[T](x: seq[T]): bool
proc isNil[T](x: ref T): bool
当我们不能有像这样的表达式时,我们应该如何编写通用代码0.isNil?
您不需要在不能为的isNil类型上使用nil,那只是没有意义。当使用泛型(假设您正在实现MyContainer[T])时,您只需引入一个新的空性概念(无论这对您意味着什么)并在您的泛型代码中使用它。
proc isEmptyElement[T](v: T): bool {.inline.} =
when compiles(isNil(v)):
isNil(v)
elif T is SomeNumber:
v == 0
else:
# Whatever else you mean by emptiness. Let's say is v the default value of T
var d: T # Default value
v == d
proc myContainerAdd[T](c: MyContainer[T], v: T) =
if not v.isEmptyElement():
# proceed
Run Code Online (Sandbox Code Playgroud)
注意isEmptyElement可以简化,它有比实际需要更多的分支,只是为了演示不同的方法。
| 归档时间: |
|
| 查看次数: |
230 次 |
| 最近记录: |