首页 > 解决方案 > 在 Nim 中使用与 Iterator 同名的 Proc 是否安全?

问题描述

我想定义为能够编写短代码proc的同名。iteratortable.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

标签: nim-lang

解决方案


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

您要求拥有短代码的其他选项是:

echo toSeq(table.keys).sorted

这使用toSeqsequtils,不幸的是你不能使用 UFCS(见github 问题)。

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

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


推荐阅读