Elixir列表模式匹配~使用列表模式匹配在常量后获取x



Elixir是否以任何方式处理相对于常量的匹配值?例如:

所有的例子都是这个想法的伪语法

  • (后面的值)3=x
  • iex>[ _ | [ 3 | [ x | _ ] ] ] = [1,2,3,4,5,6,7] // x = 4
  • (6之前的值)=x
  • iex>[ _ | [ x | [ 6 | _ ] ] ] = [1,2,3,4,5,6,7] // x = 5
  • (介于3和6之间的值的子列表)=x
  • iex>[ _ | [ 3 | [ x | [ 6 | _ ] ] ] ] = [1,2,3,4,5,6,7] // x = [4,5]
  • (4之后的3个值的子列表)=[a,b,c]
  • iex>[ _ | [ 3 | [ [a,b,c] | _ ] ] = [1,2,3,4,5,6,7] // x = [5,6,7]

不幸的是,大多数书籍和在线文档只涵盖从第一个索引开始的绝对定位,例如通过[ head | tail ]从头开始的N个元素,但随着目标值离第一个元素越来越远,使用[ _ | [ _ | [ _ | [ x | _ ] ] ] ]等语法来获取列表中的第四个元素会变得有点傻。

有什么语法可以匹配列表的相对索引吗?一个不正确但概念上合理的语法示例是通过[ _ | [ x | [] ] ]获取列表中的最后一个索引,或者通过[ _ | [ 3 | [ x | _ ] ] ]获取索引3之后的值

Elixir/Erlang不支持对列表中未知位置的项目进行模式匹配,因此您提到的4种情况都无法使用模式匹配。

唯一可以简化的是列表中第4个元素的位置。代替:

[_ | [_ | [_ | [x | _]]]]

你可以使用模式:

[_, _, _, x | _]
iex(1)> [_, _, _, x | _] = [1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6]
iex(2)> x
4

您正在滥用Elixir中已知的模式匹配。当您对在列表中查找值感兴趣时,没有模式

--(后面的值)3=x

iex> [_, x | _] = Enum.drop_while([1,2,3,4,5,6,7], fn e -> e != 3 end)
#⇒ x = 4

--(6之前的值)=x

iex> [x | _] = [1,2,3,4,5,6,7]
...> |> Enum.take_while(fn e -> e != 6 end)
...> |> Enum.reverse
#⇒ x = 5

--(介于3和6之间的值的子列表)=x

iex> [_ | x] = [1,2,3,4,5,6,7]
...> |> Enum.drop_while(fn e -> e != 3 end)
...> |> Enum.take_while(fn e -> e != 6 end)
#⇒ x = [4, 5]

--(4之后的3个值的子列表)=[a,b,c]

iex> [1,2,3,4,5,6,7] 
...> Enum.drop_while(fn e -> e != 4 end)
...> Enum.slice(1..3)
#⇒ [5,6,7]

Enum

最新更新