如何在 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'.
声明时才是不可变的
我 运行 遇到了 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'.
声明时才是不可变的