我可以写
unitlist |> Enum.filter(&(s in &1))
或者我可以写
for u <- unitlist, s in u, do: u
两种结构的功能有何不同?
答案 0 :(得分:4)
对于这种特殊情况,无论unitlist
的值是多少,它们都是相同的 - 它们都接受任何Enumerable并对每个项目运行s in &1
检查并返回一个新列表那些回报真实价值的人。
for
具有比Enum.filter
单独执行的功能更多的功能:您可以迭代多个枚举并生成结果的平面列表。你可以在<-
的左侧有一个错误的模式,而for
会默默地跳过这些项目,而不是抛出错误。您可以修改检查后返回的值。以下代码段演示了所有这些:
iex(1)> for a <- 1..3, b = 2 <- 1..3, a > 1, do: {a, b}
[{2, 2}, {3, 2}]
for
可以被Enum.map
,if
和Enum.flat_map
组合使用。以上内容与此相同:
Enum.flat_map(1..3, fn a ->
Enum.flat_map(1..3, fn
b = 2 ->
if(a > 1, do: [{a, b}], else: [])
_ ->
[]
end)
end)
|> IO.inspect
答案 1 :(得分:2)
与@Dogbert中所说的his answer一样:在你的例子中,它正在做同样的事情。并且for
理解可以做的不仅仅是过滤。它可以轻松替换很多Enum
函数。
好的,因为它更强大 - 那么为什么Enum.filter存在?你什么时候想用它代替?
想象一下,&#34;为什么驾驶房车时驾驶你的双门轿跑车才能工作?&#34; :)
Enum
函数的一些优点是它们更简单,管道链接更好,并且可以更好地描述您的意图。
e.g。
[1, 2, 3, 4]
|> Enum.filter(&(&1 > 2))
|> Enum.map(&to_string/1)
|> Enum.join()
# "34"