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

问题描述

我想用与proc相同的名称定义iterator,以便能够编写短代码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

解决方法

您可以定义具有相同签名的迭代器和proc的事实目前被认为是设计错误(请参阅issue #8901),但可能会持续一段时间。

您要求提供短代码的其他选项是:

echo toSeq(table.keys).sorted

这使用了toSeq中的sequtils,很遗憾,您不能与此同时使用UFCS(请参阅github issue)。

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

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