(Elixir/Erlang):ets.select_count返回0

pxyaymoc  于 2023-09-28  发布在  Erlang
关注(0)|答案(1)|浏览(197)

我写了一个程序使用Elixir和我有一个非常奇怪的错误。
我有一个表,其中包含一些这样存储的值:{a, b}。A是唯一值,B可以重复。
我想数一下有多少行,它们有特定的第二个值。
我呼吁的时候

:ets.select_count(table, [{{:'$1', "a"}, [], [:'$1']}])

它返回0,但如果我调用

length(:ets.select(table, [{{:'$1', "a"}, [], [:'$1']}]))

返回预期结果。
在这两次调用之间不能更改表。
版本号:

  • Erlang -25.3.2.5
  • elixir - 1.15.4(我从包管理器中获取了版本,告诉我是否错误)

我试着在Google上找到答案,但一无所获。
我做错了什么?
复制:

table = :ets.new(:tbl, [])
:ets.insert(table, {"a", "b"})
:ets.insert(table, {"b", "a"})
IO.puts('select_count: #{:ets.select_count(table, [{{:'$1', "a"}, [], [:'$1']}])}') # prints 0
IO.puts('length(select): #{length(:ets.select(table, [{{:'$1', "a"}, [], [:'$1']}]))}') # prints 1
cwdobuhd

cwdobuhd1#

根据Erlang文档:
https://www.erlang.org/doc/man/ets#select_count-2
这个函数可以被描述为一个select_delete/2函数,它不删除任何元素,而只是对它们进行计数。
看看select_delete/2的文档:
https://www.erlang.org/doc/man/ets#select_delete-2
如果要删除对象,match规范必须返回atom true。没有其他返回值会删除该对象。
所以你需要这样做:

:ets.select_count(table, [{{:'$1', "a"}, [], [true]}])

注意,返回值是true,与上面的引用雅阁。

相关问题