在 Nim 中使用与 Iterator 同名的 Proc 是否安全?

Is it safe to use Proc with the same name as Iterator in Nim?

我想定义与iterator同名的proc,以便能够编写短代码table.keys.sorted

Nim 似乎支持它并正确解决命名冲突。

这是 Nim 的官方功能吗,会在未来的版本中得到支持吗?使用这种方法安全吗?

例子

import tables, algorithm

var table = init_table[string, int]()
table["b"] = 2
table["a"] = 1

# Proc with same name as Iterator
proc keys*[K, V](table: Table[K, V]): seq[K] =
  for k in table.keys: result.add k

# Nim properly resolves `keys` as `proc` and not as `iterator`
echo table.keys.sorted

您可以定义具有相同签名的迭代器和过程这一事实目前被视为设计错误(参见 issue #8901),但它可能会持续一段时间。

您请求短代码的其他选项是:

echo toSeq(table.keys).sorted

这使用了 sequtils 中的 toSeq,不幸的是你不能将 UFCS 与它一起使用(参见 github issue)。

另一种选择(实际上是最重要的)是定义一个 template sortedKeys 执行上述操作。

或者您可能会争辩说这不是设计错误,我们可以将其视为允许您使用 table 的键作为序列的功能。 :)