问题描述
我想用与proc
相同的名称定义iterator
,以便能够编写短代码table.keys.sorted
。
这是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
。
或者您可以说这不是设计错误,我们可以将其视为允许您将表的键用作序列的功能。 :)