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



我遇到了 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 语言数组。

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

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

我假设你需要:

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

实现:

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: "键 1", 字段 1: "值 1"(

(字段 0: "键 2", 字段 1: "值 2"(


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

使用 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

输出:

@["键1", "键2"]

OBS:编辑了我的答案,因为如果使用"var"声明 seq 不是不可变的。只有当用"let"声明时,它才是不可变的。

最新更新