我遇到了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函数内正常工作。
答案 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;声明,它只是不可变的。