Elixir列表模式匹配〜使用列表模式匹配后得到x

时间:2017-01-26 09:53:06

标签: linked-list erlang pattern-matching elixir

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]

不幸的是,大多数书籍和在线文档仅涵盖第一个索引的绝对定位,例如来自头部的N个元素通过[ head | tail ]但是当目标值远离第一个元素时,这变得有点愚蠢,语法如{ {1}}获取列表中的第4个元素。

是否有任何匹配列表相关索引的语法?一个不正确但概念上合理的语法的例子是通过[ _ | [ _ | [ _ | [ x | _ ] ] ] ]获取列表中的最后一个索引,或者通过[ _ | [ x | [] ] ]

获取索引3之后的值

2 个答案:

答案 0 :(得分:1)

Elixir / Erlang不支持模式匹配列表中未知位置的项目,因此您提到的4种情况都不能通过模式匹配完成。

唯一可以简化的是你想要列表的第4个元素。而不是:

for key in dictionary_test.keys():
     print(key)

你可以使用模式:

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

答案 1 :(得分:1)

你正在滥用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