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
。