如何获得Elixir范围的尾部

Sim*_*one 3 elixir pattern-matching

这可能是一个微不足道的问题,但我无法理解它.

我只是想在一个范围上进行模式匹配,得到头部和尾部.

这是我试过的:

iex(1)> [h|t] = [1..3]
[1..3]
iex(2)> h
1..3
iex(3)> t
[]
Run Code Online (Sandbox Code Playgroud)

如你所见,它没有达到我的预期.我的期望是h = 1t = [2,3].

如何将头部和尾部排除在范围之外?这甚至可能吗?

Dog*_*ert 6

首先,[1..3]是一个包含1个范围而不是范围的列表.其次,范围本身不是列表,它只是一个包含2个值的结构:第一个和最后一个值(Map.from_struct(1..10) #=> %{first: 1, last: 10}).如果您希望将范围的头部和尾部作为列表,则需要首先将范围转换为列表:

iex(1)> range = 1..3
1..3
iex(2)> list = Enum.to_list(range)
[1, 2, 3]
iex(3)> [h | t] = list
[1, 2, 3]
iex(4)> h
1
iex(5)> t
[2, 3]
Run Code Online (Sandbox Code Playgroud)

请注意,这取决于您正在做什么,效率非常低.范围占用非常少的内存(Struct + 2整数键).列表将占用与列表中的项目数成比例的空间.根据您正在做的事情,可能有一种比将范围转换为列表更好的方法.


edw*_*enz 5

这应该工作得更好

iex(42)> range = 1..100     
1..100
iex(43)> _..last = range    
1..100
iex(44)> last
100
Run Code Online (Sandbox Code Playgroud)