我试图从表中获取值,而不知道它是否在编译时包含给定的键。
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!"
将产生相同的编译器错误。有没有办法以这种方式获得一张桌子的钥匙?
答案 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我喜欢海龟