列表理解与Enum.filter

时间:2017-09-13 14:23:30

标签: elixir

我可以写

unitlist |> Enum.filter(&(s in &1))

或者我可以写

for u <- unitlist, s in u, do: u

两种结构的功能有何不同?

2 个答案:

答案 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.mapifEnum.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"