isNil不能用于文字

时间:2018-04-18 14:17:15

标签: null nim

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这样的表达式时,我们应该如何编写通用代码呢?

2 个答案:

答案 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)

Implement all the types

proc isNil(x: int): string = "meme"

echo 0.isNil