我写了一个程序使用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
1条答案
按热度按时间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。没有其他返回值会删除该对象。
所以你需要这样做:
注意,返回值是
true
,与上面的引用雅阁。