isNil 不能用于文字

v.o*_*dou -1 null nim-lang

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

ura*_*ran 5

您不需要在不能为的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可以简化,它有比实际需要更多的分支,只是为了演示不同的方法。

  • 你可以从不同的角度来看待它。`isNil` 只是为可以为 `nil` 的类型定义的函数。您可以为自己的类型定义自己的类型。就像`isEven` 和`isOdd` 是为整数定义的,你为什么不抱怨`isEven` 不是为`File` 定义的,因为`File`s 不是偶数,也不是奇数,对吧?如果您的通用算法需要知道一个值(是否为 nillable 和 nil)是否是您的算法特有的问题,那么您可以在本地解决它,而不会泄漏额外的抽象。 (6认同)