2017-07-22 20 views
3

我遇到了Nim序列的問題,並從函數返回它們。如何在Nim中處理seq作爲返回值

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 

該代碼在主函數內工作良好。

+3

原因是'get_json_keys'的返回類型是'seq'而不是'seq [string]'。問題是'seq'是一個類型類,而不是一個具體的類型。如果用'seq [string]'替換返回類型,則問題應該消失。 –

+0

這是正確的...我是尼姆的新手。完全錯誤的錯誤 – wishi

+1

不是你的錯,錯誤信息是非常誤導。我注意到它是因爲「模板/泛型實例化」部分,它只能在調用模板,具有顯式泛型參數的過程或使用類型類的過程時纔會發生。 –

回答

1

問題:

*序列是一個通用的動態數組,你只能添加鍵和所有的搜索將是線性的,因爲它是類似於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 

輸出:

(Field0: 「KEY1」,字段1: 「VALUE1」)

(Field0: 「KEY2」,字段1:「值2「)


如果搜索速度是不是一個問題,你也可以做到這一點的方法:

實現使用了序列:

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」, 「KEY2」 ]

obs:編輯我的答案,因爲如果用'var'聲明seq不是不可變的。只有用'let'聲明,它纔是不可變的。

相關問題