Эликсир - почему компилятор не предупреждает об этих повторяющихся заголовках?

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

  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
Ха-ха, спасибо, мне потребовалось время, чтобы это заметить;) - person sabiwara; 12.08.2020
comment
Спасибо @sabiwara, теперь я могу вернуться к своей настоящей работе и перестать пялиться! - person Sinc; 12.08.2020
comment
Я новичок в Elixir и забыл о третьем способе ограничения заголовка функции: совпадениях, защите и повторно используемых именах переменных. С другой стороны, руководитель моей группы, который работал над Elixir несколько лет и написал исходный код, не понял, почему они не были дубликатами. - person Sinc; 14.08.2020