[something(X) || X <- L],是一个列表理解。 L 是一个元素列表,这个表达式创建一个新元素列表,通过在其上调用 something() 来形成每个元素。
[something(X,Y) || X <-L, Y<-M] 类似,但为 X 和 Y 中每个元素的笛卡尔积创建了一个元素。
[something(X) || X <-L, Expr] 是一个过滤器表达式。与第一个相同,但仅对 L 的元素执行,其中 Expr 对于给定的 X 为 true。
[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]
因此,您的代码会生成来自 PV1a 的所有 {Pid1a, V1a} 元素和来自 P2 的 Pid2 元素的笛卡尔积,但 Pid1a 等于 Pid2 的那些元素除外,并且对于这些对中的每一个都将 {delete, V1a} 消息发送到PID2。