Elixir是否以任何方式处理相对于常量的匹配值? 一个例子是::
所有示例都是该想法的伪语法
[ _ | [ 3 | [ x | _ ] ] ] = [1,2,3,4,5,6,7] // x = 4
[ _ | [ x | [ 6 | _ ] ] ] = [1,2,3,4,5,6,7] // x = 5
[ _ | [ 3 | [ x | [ 6 | _ ] ] ] ] = [1,2,3,4,5,6,7] // x = [4,5]
[ _ | [ 3 | [ [a,b,c] | _ ] ] = [1,2,3,4,5,6,7] // x = [5,6,7]
不幸的是,大多数书籍和在线文档仅涵盖第一个索引的绝对定位,例如来自头部的N个元素通过[ head | tail ]
但是当目标值远离第一个元素时,这变得有点愚蠢,语法如{ {1}}获取列表中的第4个元素。
是否有任何匹配列表相关索引的语法?一个不正确但概念上合理的语法的例子是通过[ _ | [ _ | [ _ | [ x | _ ] ] ] ]
获取列表中的最后一个索引,或者通过[ _ | [ x | [] ] ]
答案 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]