如何在Nim中处理seq作为返回值

时间:2017-07-22 12:59:58

标签: nim

我遇到了Nim序列的问题,并从函数中返回它们。

json_p.nim(42, 33) template/generic instantiation from here
json_p.nim(28, 22) Error: no generic parameters allowed for seq

第28行是我定义key_list

的地方
proc get_json_keys(json_data: JsonNode) : seq =
    var key_list: seq[string] = @[] # 28
    var key: string
    for record in json_data:
        for key, value in record:
            if (not key_list.contains(key)):
                key_list.add(key)
    return key_list

我只是从主叫它。

proc main() : void =     
    var file = get_url()
    var json_data = file.parseFile()

    [...]

    var key_list = get_json_keys(json_data)
    for key in key_list:
        echo key

代码在main函数内正常工作。

1 个答案:

答案 0 :(得分:1)

问题:

* seq是一个通用动态数组,您只能添加键,所有搜索都是线性的,因为它类似于C语言数组。

*所有返回值的函数都有一个默认的"结果"命名变量。您应该使用它来返回您的值。

*使用" .contains"将使nim搜索整个数组以便检查。最好的选择是使用快速搜索的容器。

我假设你需要:

*一个处理json重复键的函数,并通过快速键搜索返回唯一列表。

<强>实施

proc get_json_keys(json : JsonNode):seq[string]=
  result = newSeq[string](0)
  for key,value in json.pairs():
    if not result.contains(key):
      result.add(key)

var json_data = parseJson("""{"key1" :"value1","key2" :"value2","key1":"value3" }""")
var key_list = get_json_keys(json_data)
echo key_list

<强>输出:

(Field0:&#34; key1&#34;,Field1:&#34; value1&#34;)

(Field0:&#34; key2&#34;,Field1:&#34; value2&#34;)

如果搜索速度不是问题,您也可以这样做:

使用seq实现

TextView

<强>输出:

@ [&#34; key1&#34;,&#34; key2&#34;]

obs:编辑我的答案,因为如果使用&var;&#39;声明,seq不是不可变的。如果用&#39; let&#39;声明,它只是不可变的。