Исходя из динамически типизированного Ruby, концепция перегрузки функций была для меня очень чуждой. Я надеюсь кратко объяснить эту концепцию другим разработчикам, посмотрев на код проекта, над которым я работал.

Elixir обладает очень мощными возможностями сопоставления с образцом, которые позволяют нам проверять конкретные случаи ввода.

Как вы можете видеть выше, функция make_move определяется здесь дважды. Если вы также пришли из такого языка, как Ruby, вы, вероятно, ожидаете, что это вызовет ошибку. Однако, поскольку Elixir может сопоставлять шаблон в параметрах функции, Elixir рассматривает эти две функции как совершенно разные функции.

Если немного разбить код, первое предложение принимает как состояние игры, так и предположение, как и второе. Первое предложение ДОЛЖНО соответствовать определенному шаблону в самом игровом состоянии, чтобы оно могло быть вызвано. Мы используем деструктуризацию, чтобы привязать значение game_state к состоянию переменной. Затем мы используем защитное предложение для проверки определенных значений этого состояния. Только выигранные и проигранные игры проходят через первое функциональное предложение. Второе предложение обрабатывает все остальные вызовы этой функции. Как мы видим, вторая функция выполняет дополнительный вызов другой функции: accept_move. Мы больше не хотели бы принимать ходы в выигранной или проигранной игре, поэтому эта функция имеет смысл.

Сила здесь потрясающая! Поскольку Elixir немного борется с шаблонами циклов и условными операторами, перегрузка функций - отличный способ их субсидировать! Привычка писать перегруженные функции вместо операторов if else помогло мне еще больше сместить мое мышление в сторону функциональной парадигмы. Я призываю вас не писать ни одного оператора if else в вашем следующем проекте Elixir!