echo 0.isNil
类型不匹配:得到< int literal(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
这样的表达式时,我们应该如何编写通用代码呢?
答案 0 :(得分:4)
您不需要在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
注意isEmptyElement
可以简化,它有更多的分支,而不仅仅是为了演示不同的方法。
答案 1 :(得分:2)
proc isNil(x: int): string = "meme"
echo 0.isNil