从表中获取密钥在编译时未知

时间:2017-05-25 08:44:38

标签: hashmap nim

我试图从表中获取值,而不知道它是否在编译时包含给定的键。

proc getFirst(table: Table[int, string]): string =
  return table[0]

var t = initTable[int, string]()
t.add(0, "I like turtles")

echo t[0]                        # works!
echo t.getFirst()                # works!    

echo t[1]                        # Error: unhandled exception: key not found: 1 [KeyError]

const str: string = t.getFirst() # Error: cannot evaluate at compile time: t
echo str                         

echo t[0]echo t[1]完全符合我的预期。

echo t.getFirst()让我感到困惑。我想编译器能够推断出密钥存在。如果我错了,请纠正我。

const str: string = t.getFirst()根本不起作用。即使通过编辑proc来检查密钥是否存在,例如

proc getFirst(table: Table[int, string]): string =
  if table.hasKey(0):
    return table[0]
  else:
    return "I do not exist!"

将产生相同的编译器错误。有没有办法以这种方式获得一张桌子的钥匙?

1 个答案:

答案 0 :(得分:1)

如果表为空,则访问索引表[0]将生成异常(“未找到键”)。我想你需要这样的东西:

import json,tables

proc get(table: Table[int, string]; index : int): string =
  if table.len() <= 0:
    result = "empty"
  else:
    if table.hasKey(index):
      return table[index]
    else:
      return "missing"

var t = initTable[int, string]()
t.add(0, "I like turtles")

echo t[0]      # works butgenerates exception if table is empty!
echo t.get(0)  # works even if table is empty or table[0] is missing

echo t.get(2)  # missing

for key,value in t.pairs():
  echo $key & " " & value

<强>输出

我喜欢海龟

我喜欢海龟

丢失

0我喜欢海龟