【问题标题】:Is it safe to use Proc with the same name as Iterator in Nim?在 Nim 中使用与 Iterator 同名的 Proc 是否安全?
【发布时间】:2020-08-27 12:57:20
【问题描述】:

我想定义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

【问题讨论】:

    标签: nim-lang


    【解决方案1】:

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

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

    echo toSeq(table.keys).sorted

    这使用来自sequtils 的toSeq,不幸的是你不能使用UFCS(见github issue)。

    另一个选项(实际上是在此之上)是定义一个 template sortedKeys 来完成上述操作。

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

    【讨论】:

    • 谢谢,是的,我认为最好保留该功能,直到有人发明更好的方法来允许函数链接等:)。
    猜你喜欢
    • 2021-12-29
    • 2011-08-08
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    相关资源
    最近更新 更多