【发布时间】:2016-10-01 03:53:36
【问题描述】:
lists:foreach函数可以用来删除回调函数中的元素吗?即如果修改发生迭代的列表会不会有任何问题。
【问题讨论】:
标签: erlang
lists:foreach函数可以用来删除回调函数中的元素吗?即如果修改发生迭代的列表会不会有任何问题。
【问题讨论】:
标签: erlang
我想这个简单的答案是否定的。
lists:foreach/2 函数用于对列表中的所有元素运行特定函数。除此之外,它还返回ok 原子。它不会返回文档定义的列表。
foreach(Fun, List) -> ok
为List中的每个元素Elem调用Fun(Elem)。此函数用于其副作用,并且计算顺序被定义为与列表中元素的顺序相同。
如果你想对每个元素执行一些函数并返回一个包含这个函数结果的列表,你可以使用lists:map/2。不过请注意,与foreach 相比,map 不保证任何评估顺序。
如果您只想从列表中删除一个元素,只需使用lists:delete/2。
【讨论】:
PidList 的所有元素你可以做lists:foreach(fun(E)->Pid ! E end, List)。
foreach 适用于具有副作用的函数的特定属性是保证将函数应用于列表顺序之后的列表元素。即使您也可以使用 map 并忽略结果,但理论上 map 不保证任何评估顺序(因为评估顺序与纯函数无关)