Qui*_*ncy 3 erlang functional-programming
我无法理解这一行.
[Pid2 ! {delete, V1a}
|| {Pid1a, V1a} <- PV1a, Pid2 <- P2, Pid1a /= Pid2
],
Run Code Online (Sandbox Code Playgroud)
这是我的理解:双管之前的任何东西"||" 根据双管后面的内容重复完成.所以带有删除原子的消息会重复发送到Pid2.我知道'/ ='意味着不平等.我不明白'< - '是什么意思,最终意味着整行意味着什么.
Zed*_*Zed 15
[something(X) || X <- L],是列表理解.L是一个元素列表,这个表达式创建一个新元素列表,通过在其上调用something()来形成每个元素.
[something(X,Y) || X <-L, Y<-M] 类似,但是为X和Y中的每个元素的笛卡尔积创建了一个元素.
[something(X) || X <-L, Expr]是一个过滤表达式.与第一个相同,但它仅对L的元素执行,其中Expr对于给定的X为真.
[something(X) || {X,..} <-L, Expr]是另一种过滤器.在列表推导中,只有那些元素可以匹配的元素.
还有一件事需要知道,这不仅可以用于生成另一个列表,还可以用于为每个元素执行命令.如果列表推导的结果不匹配,编译器将知道根本不生成列表.此行为可用于模仿foreach其他语言.
一些例子:
1> [ X*2 || X <- [1,2,3] ].
[2,4,6]
2> [ X*Y || X <- [1,2], Y <- [3,4,5] ].
[3,4,5,6,8,10]
3> [ X*3 || X <- [1,2,3,4], X rem 2 == 0 ].
[6,12]
4> [ X || {a,X} <- [{a,1},{a,2},{b,3},{c,4}] ].
[1,2]
Run Code Online (Sandbox Code Playgroud)
因此,您的代码生成来自PV1a的所有{Pid1a,V1a}元素和来自P2的Pid2元素的笛卡尔积,除了那些Pid1a等于Pid2的元素,并且对于这些元素中的每一个都将{delete,V1a}消息发送到Pid2.
我不知道Erlang,但这看起来就像我知道的一堆语言中的列表推导.希望这个猜测会帮助你,直到有人知道Erlang可以回答:
[Pid2 ! {delete, V1a} || {Pid1a, V1a} <- PV1a, Pid2 <- P2, Pid1a /= Pid2],
Run Code Online (Sandbox Code Playgroud)
转换为命令式伪代码:
For each item in PV1a, unpacking item to {Pid1a, V1a}
For each Pid2 in P2
If Pid1a /= Pid2
Pid2 ! {delete, V1a}
Run Code Online (Sandbox Code Playgroud)
换句话说,对于PV1a和P2中的每个Pid,只要Pid1和Pid2不是相同的Pid,就将消息删除V1a发送到Pid2.