Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Elixir中,如何将范围转换为列表?_Elixir - Fatal编程技术网

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

在Elixir中,如何将范围转换为列表?,elixir,Elixir,我可以按如下方式声明一个范围: range = 1..10 有没有办法将范围转换为列表?使用Enum.map/2 range = 1..10 Enum.map(range, fn(x) -> x end) 或 Enum.to_list/1是您要查找的: iex(3)> Enum.to_list 1..10 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 将可枚举项转换为特定集合的通用方法是Enum.into: Enum.into 1..10, [] #=>

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

range = 1..10

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

使用
Enum.map/2

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


Enum.to_list/1
是您要查找的:

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

将可枚举项转换为特定集合的通用方法是
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}

使用管道操作符

1..10 |> Enum.to_list

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
然后,您可以对其应用进一步的转换,如

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

55
这里有一个微基准,比较了前面答案中的方法

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\u 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
可能是最有效的选择。

这比我的答案还要好。:)这是最快的方法(至少在我的机器上)。下面是我的电脑中的微基准点。
Enum.to_list    10000000   0.32 µs/op
Enum.into       10000000   0.32 µs/op
Enum.map        10000000   0.45 µs/op