如何在 Nim 中将序列作为 return 值处理

How to handle a seq as a return value in 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

代码在主函数中运行良好。

问题:

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

*所有函数 returning 值都有一个默认的 "result" 命名变量。你应该用它来return你的价值观。

*使用“.contains”将使 nim 搜索整个数组以进行检查。最好的选择是使用具有快速搜索功能的容器。

我假设你需要:

*处理 json 重复键和 return 具有快速键搜索的唯一列表的函数。

实施:

import json,tables

proc get_json_keys(json : JsonNode):OrderedTable[string,string]=
  #initialize the result object
  result = initOrderedTable[string,string]()
  #more info,see https://nim-lang.org/docs/json.html
  for key,value in json.pairs():
    #debugging...
    #echo key & "-" & value.getStr()
    if not result.contains(key):
      result[key]=value.getStr()

var json_data = parseJson("""{"key1" :"value1","key2" :"value2" }""")
var key_list = get_json_keys(json_data)
for key in key_list.pairs() :
  echo key

输出:

(字段 0: "key1", 字段 1: "value1")

(字段 0: "key2", 字段 1: "value2")


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

使用seq实现:

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

输出:

@["key1", "key2"]

obs:编辑了我的答案,因为如果用 'var' 声明,seq 不是不可变的。它只有在用 'let'.

声明时才是不可变的