微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。