在Elixir中,如何将范围转换为列表?

时间:2014-09-16 19:10:42

标签: elixir

我可以按如下方式声明范围:

range = 1..10

有没有办法将范围转换为列表?

5 个答案:

答案 0 :(得分:89)

Enum.to_list/1正在寻找:

iex(3)> Enum.to_list 1..10
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

答案 1 :(得分:15)

将可枚举转换为特定收藏品的一般方法是Enum.into

Enum.into 1..10, []
#=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

您还可以将转换函数作为第三个参数传递:

Enum.into 1..10, %{}, &({&1, &1})
#=> %{1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6, 7 => 7, 8 => 8, 9 => 9, 10 => 10}

答案 2 :(得分:9)

使用Enum.map/2

range = 1..10
Enum.map(range, fn(x) -> x end)

Enum.map(range, &(&1))

答案 3 :(得分:3)

使用管道运算符

1..10 |> Enum.to_list

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

然后你可以在其上应用进一步的转换,如

1..10 |> Enum.to_list |> Enum.sum

55

答案 4 :(得分:2)

这是一个Benchfella微基准测试,用于比较先前答案中找到的方法。

defmodule RangeToListBench do
  use Benchfella

  @test_range 1..1000

  bench "Enum.map",     do: Enum.map(@test_range, &(&1))
  bench "Enum.to_list", do: Enum.to_list(@test_range)
  bench "Enum.into",    do: Enum.into(@test_range, [])
end

这是我在2017年MacBook Pro上获得的内容,其中@test_range设置为1..1000

benchmark nam iterations   average time 
Enum.to_list      100000   21.97 µs/op
Enum.into         100000   23.72 µs/op
Enum.map           50000   34.72 µs/op

1..100_000的范围更大时,相对顺序保持不变:

Enum.to_list        1000   2427.21 µs/op
Enum.into           1000   2540.62 µs/op
Enum.map             500   3414.07 µs/op

对于1..10较小范围也是如此:

Enum.to_list    10000000   0.32 µs/op
Enum.into       10000000   0.32 µs/op
Enum.map        10000000   0.45 µs/op

TL; DR Enum.to_list/1可能是最有效的选择。