药剂是否以任何方式处理与常量相关的匹配值?这方面的一个例子是:
所有的例子都是这个想法的伪语法。
[ _ | [ 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]不幸的是,大多数书籍和在线文档只涉及来自第一个索引的绝对位置,例如通过[ head | tail ]从头中提取的N个元素,但是随着目标值与第一个元素的距离越来越远,使用[ _ | [ _ | [ _ | [ x | _ ] ] ] ]这样的语法来获得列表中的第4个元素就有点愚蠢了。
是否有任何语法来匹配列表的相对索引?不正确但在概念上合理的语法的一个例子是通过[ _ | [ x | [] ] ]获取列表中的最后一个索引,或者通过[ _ | [ 3 | [ x | _ ] ] ]在索引3之后获取值。
发布于 2017-01-26 10:04:09
灵丹妙药/Erlang不支持在列表中未知位置的项目匹配模式,因此您提到的4种情况都不能通过模式匹配完成。
唯一可以简化的是,您需要列表的第四个元素。而不是:
[_ | [_ | [_ | [x | _]]]]您可以使用以下模式:
[_, _, _, x | _]iex(1)> [_, _, _, x | _] = [1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6]
iex(2)> x
4发布于 2017-01-26 12:18:54
您正在滥用模式匹配,这是众所周知的灵丹妙药。如果您对在列表中查找值感兴趣,则不存在任何模式。
-(后面的值)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。
https://stackoverflow.com/questions/41870779
复制相似问题