模式匹配比较

时间:2018-09-06 08:48:55

标签: elixir

我正在创建一个案例声明,并达到一个案例,我认为进行模式匹配比较可能是不错的/适用的。我似乎在网上找不到任何东西。以下面的假设示例为例:

person = %Person{first_name: "Test", last_name: "example}
person2 = %Person{first_name: "another", last_name: "person"}

case list do
   [] -> 
     :empty

   [person, person2] == [%Person{} | _] ->
     :true

   [_] -> 
     :no_Person_struct
end

当然,这只会检查列表的开头,但是有什么类似的方法或方法吗?

如果可能的话,也可以否定它。即

[person, person2] == [%NotAPerson{} | _] == false -> :true

语法很可能是错误的。

编辑:至少参数中的模式匹配如何?

def([%Person{} | _] = people) do

1 个答案:

答案 0 :(得分:1)

您使事情复杂化了。

case list do
   [] -> :empty
   [%Person{} = _person | _] -> :first_is_a_person
   [_ | _] -> :first_is_not_a_person # because the previous clause did not match
end

要检查列表中的所有元素,请使用Enum.all?/2

Enum.all?(list, fn
  %Person{} -> true
  _ -> false
end)