我有这个Erlang代码:
not lists:any(fun(Condition) ->Condition(Message) end, Conditions).
任何人都可以用外行的话解释整个声明吗?对于您的信息,Condition
是一个函数,Conditions
是一个数组。 fun(Condition) ->Condition(Message) end
是什么意思?以及not lists:any
的含义。
答案 0 :(得分:6)
fun(Condition) ->Condition(Message) end
是一个lambda函数,它将函数Condition
应用于Message
的值(作为周围代码的闭包)。
lists:any
是一个函数,它接受谓词和值列表,并依次调用每个值的谓词,如果有任何谓词调用,则返回原子true
。
总的来说,如果列表true
中的Condition
个函数都没有为Conditions
值返回true
,则结果为原子Message
。
编辑 - 添加lists:any
any(Pred, List) -> bool()
类型:
Pred = fun(Elem) -> bool()
Elem = term()
List = [term()]
如果Pred(Elem)
为List中的至少一个元素Elem
返回true,则返回true。
答案 1 :(得分:1)
条件是接收消息并在满足某些条件时返回布尔值的东西。
代码遍历条件列表,如果其中任何表示为true,则返回false,如果所有,则表示false,则表示为true。
大致翻译为详细的伪 - Python:
def not_lists_any(Message,Conditions):
for Condition in Conditions:
if Condition(Message):
return False
return True
答案 2 :(得分:1)
在其他答案中,语法和stdlib描述落后一步:
此代码看起来非常像chain-of-responsibility design pattern的Erlang实现。消息(在OOP sense of the word)中“遍历”所有可能的处理程序(来自Conditions
数组的函数),直到有人可以处理它。根据作者的约定,处理消息的那个会返回true
(否则为false
),所以如果没有人能够处理消息,那么整个表达式的结果是true
:
% this is your code wrapped in a function
dispatch(Message, Handlers) ->
not lists:any(fun(Condition) ->Condition(Message) end, Handlers).
可以像这样使用:
CantHandle = dispatch(Event, Handlers),
if CantHandle->throw(cannot_handle); true->ok end.