我想对 ETS 表中的所有元组应用一个函数:
该表是一组,每个键只出现一次。
我的表只包含相同类型的元组:
{Key, X, Y, VX, VY}
所有值都是::integer()
我想要做的是有一个特定的值 Elapsed 并用一个函数更新我所有的元组apply_vector/2
apply_vector({K, X, Y, 0, 0}, _Elapsed) ->
{K, X, Y, 0, 0};
apply_vector({K, X, Y, VX, VY}, Elapsed) ->
NewX = X + (VX * Elapsed),
NewY = Y + (VY * Elapsed),
{K, NewX, NewY, VX, VY}.
可能的解决方案
如果我使用
ets:foldl
,我的插入可能会在折叠期间被遍历,并导致无限(非常长)循环。我可以用 a 准备新的元组
ets:foldl
,然后插入整个列表。我可以插入一个新表,然后用新表替换旧表,但我不想通过调用 gen_server 来限制对表的访问,该表必须随时可以访问。
我不能使用
ets:update_element
,因为我需要读取 VX 和 VY 值来更新 X 和 Y。我知道有一些迭代器实用程序,但似乎没有人允许传递乐趣。
我需要每 1 - 5 秒进行一次更新。那么,对于 10 个元组,哪种解决方案最有效?有 100 个元组?有更多?
谢谢你 !
I Keep a list of boats,Key是Boat ID,X和Y是地理坐标,VX和VY代表运动向量:一秒的位移。Elapsed 是一个比率,即自上次更新以来的秒数。该表有助于随时了解每艘船的位置。