如何将范围传递给Elixir的Enum.filter?

时间:2016-07-31 08:15:39

标签: elixir

是否可以将范围传递给Elixir的Enum.filter。例如,

这有效

[1,2,3,4,5] |> Enum.filter(&rem(&1,2)==0) #=> [2,4]

但这不是

[1..10] |> Enum.filter(&rem(&1,2)==0) #=> bad argument in arithmetic...

我有一个列表,其中包含我想传递给过滤器的范围。例如

[1..10, 2, 3]

2 个答案:

答案 0 :(得分:3)

您无需将其包装在[]

iex(1)> 1..10 |> Enum.filter(&rem(&1,2)==0)
[2, 4, 6, 8, 10]

[1..10]是长度为1的列表,第一个元素等于范围1..10

要过滤包含数字和范围的列表,我会像这样使用Enum.flat_map

iex(2)> [1..10, 2, 3] |> Enum.flat_map(fn
...(2)>   n when is_number(n) -> if rem(n, 2) == 0, do: [n], else: []
...(2)>   enum -> Enum.filter(enum, &rem(&1, 2) == 0)
...(2)> end)
[2, 4, 6, 8, 10, 2]

答案 1 :(得分:2)

如果您想在创建可读性范围时使用括号,请使用(1..10) |> Enum.filter(&rem(&1,2)==0)

# declare anonymous function for checking is number even
is_even = &rem(&1,2) == 0
(1..10) |> Enum.filter(&is_even.(&1))

在您的示例中,最易读的解决方案是:

{{1}}