Nim的元编程和UFCS设施似乎很好地解决了您需要的问题:
proc `-`[K, V](a: HashSet[K], b: Table[K, V]): HashSet[K] =
result = a
for k in b.keys:
result.excl k
var diff = b - a
正如您所怀疑的,这将比只为一个集合分配一个全新的序列来丢弃它更有效。然而,似乎没有一种内在的方式来完成你想要完成的事情。
这个
undeclared field: "keys"
在以下情况下,错误是有意义的
keys
是
an
inline
iterator
而不是字段,但是此错误消息肯定会提供更多信息。如果希望使用任意迭代器,似乎必须
wrap it in a closure
,尽管这可能会导致一些开销。
具有
toClosure
从
nim-iterutils
包装:
template toClosure*(i): auto =
## Wrap an inline iterator in a first-class closure iterator.
iterator j: type(i) {.closure.} =
for x in i:
yield x
j
proc `-`[K](a: HashSet[K], b: iterator): HashSet[K] =
result = a
for k in b():
result.excl k
var diff = b - toClosure(a.keys)
如果不需要完整的结果,那么产生差异可能会有更大的性能。
iterator without_keys[K, V](a: HashSet[K], b: Table[K, V]): K =
for k in a.items:
if not b.has_key(k):
yield k
for k in b.without_keys(a):
echo k