Elixir - защо няма предупреждение на компилатора за тези дублиращи се заглавки?

Днес, докато разглеждах някакъв код, попаднах на следните две заглавки на функции и разбрах, че доколкото мога да преценя, те трябва да са дубликати. Същият брой параметри и без съвпадения или предпазители, които да ни позволят да заобиколим първия. Но компилаторът не ме предупреждава, че вторият никога няма да съвпадне. Някакво обяснение защо би било така?

  def update_display_cache(context, text, line_no, position, text, adjusted_text, _) do
  def update_display_cache(context, display_line, line_no, position, text, adjusted_text, _) do

Направих няколко прости функции със съответстващи списъци с параметри, включително една със завършващия параметър _ и всички те дадоха очакваното предупреждение.
warning: this clause cannot match because a previous clause at line 24 always matches

Също така копирах и поставих цялата заглавка и тялото на първата функция без промени и все още не получих предупреждение.

Еликсир 1.7.4


person Sinc    schedule 11.08.2020    source източник
comment
Само за да съм сигурен... функцията дефинирана ли е в същия модул? И сигурен ли си, че нещата са прекомпилирани? (Понякога премахването на директорията _build е крайната проверка)   -  person Everett    schedule 11.08.2020
comment
Поправете ме, ако греша, но доколкото виждам и двете функции имат еднакъв брой параметри, без предпазители, които да помагат да ги разграничите.   -  person Guru Stron    schedule 11.08.2020
comment
Историята на това очевидно датира от няколко години през няколко модула, копирани и поставени. Повярвайте ми, той е прекомпилиран! @GuruStron това е смисълът на въпроса. Не виждам разлика между заглавките освен име, така че защо компилаторът не ме предупреждава?   -  person Sinc    schedule 12.08.2020
comment
@Sinc Да, пропуснах въпросното не)   -  person Guru Stron    schedule 12.08.2020


Отговори (1)


Параметърът text се появява два пъти в първата дефиниция, добавяйки допълнителното ограничение, че тези две стойности трябва да бъдат равни, за да съвпадат.

По-прост минимален пример, който го възпроизвежда:

  def equals?(a, a), do: true
  def equals?(_, _), do: false
person sabiwara    schedule 12.08.2020
comment
????️ Остро око! ????️ - person Aleksei Matiushkin; 12.08.2020
comment
Хаха thx, всъщност ми отне известно време, за да забележа ;) - person sabiwara; 12.08.2020
comment
Благодаря @sabiwara, сега мога да се върна към истинската си работа и да спра да зяпам! - person Sinc; 12.08.2020
comment
Аз съм сравнително нов в Elixir и забравих третия начин, по който заглавката на функция може да бъде ограничена: съвпадения, предпазители и повторно използвани имена на променливи. От друга страна, ръководителят на моя екип, който прави Elixir от няколко години и написа оригиналния код, не забеляза защо те не са дубликати. - person Sinc; 14.08.2020