Сравнение шаблонов - PullRequest
       8

Сравнение шаблонов

0 голосов
/ 06 сентября 2018

Я создавал оператор case и достиг случая, когда я подумал, что было бы неплохо / применимо сделать сравнение соответствия шаблонов . Я не могу найти что-нибудь в Интернете об этом. Возьмите следующий гипотетический пример:

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

Конечно, это будет проверять только заголовок списка, но есть ли что-нибудь подобное или способ сделать это?

Также отрицание этого было бы неплохо, если это возможно. т.е. * +1008 *

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

Синтаксис, скорее всего, неверен.

РЕДАКТИРОВАТЬ: Как насчет сопоставления с образцом в аргументах по крайней мере?

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

1 Ответ

0 голосов
/ 06 сентября 2018

Вы слишком усложняете вещи.

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)
...