2017-07-22 32 views
3

Nimシーケンスで問題が発生しており、それらを関数から戻しています。私はちょうどメインからそれを呼び出す私のkey_listNimで戻り値としてseqを処理する方法

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 

を定義し

json_p.nim(42, 33) template/generic instantiation from here 
json_p.nim(28, 22) Error: no generic parameters allowed for seq 

ライン28です。

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関数内で正常に動作します。

+3

これは、 'get_json_keys'の戻り値の型が' seq [string] 'ではなく' seq'であるためです。問題は 'seq'は型クラスであり、具体的な型ではないということです。戻り値の型を 'seq [string]'に置き換えると、問題はなくなります。 –

+0

それは正しいです...私はNimに新しいです。エラーを完全に誤読 – wishi

+1

あなたの責任ではない、エラーメッセージは非常に誤解を招く。私はテンプレート/ジェネリックインスタンシエーションの部分のためにそれに気付きました。これは、テンプレート、明示的な汎用パラメータを持つプロシージャ、または型クラスを使用するプロシージャを呼び出す場合にのみ発生します。 –

答えて

1

問題:

* seqが一般的な動的配列であるANあなただけのキーを追加することができますし、それは、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: "キー1"、フィールド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'で宣言されているのは不変です。

関連する問題