繁体   English   中英

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

[英]In Elixir, how can a range be converted to a list?

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

range = 1..10

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

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}

使用Enum.map/2

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

或者

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

使用管道运算符

1..10 |> Enum.to_list

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

然后你可以对它应用进一步的转换,比如

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

55

这是一个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范围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;DREnum.to_list/1可能是最有效的选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM