Я получаю то, что считаю довольно странным предупреждением при попытке скомпилировать модуль Elixir (используя Elixir 1.3.2 и Erlang R19). Код из книги Introducing Elixir
:Предупреждение о компиляционном модуле
defmodule Drop do
def fall_velocity(distance) do
:math.sqrt(2 * 9.8 * distance)
end
def fall_velocity(distance, gravity \\ 9.8) do
:math.sqrt(2 * gravity * distance)
end
end
Когда я скомпилировать его, оболочка говорит:
warning: this clause cannot match because a previous clause at line 2 always matches
drop.ex:6
Line 6 является вторым определением функции, и линия 2 является первым один.
Однако, когда я использую код, он отлично работает:
iex(12)> Drop.fall_velocity(20)
19.79898987322333
iex(13)> Drop.fall_velocity(20, 1.6)
8.0
Что же тогда смысл этого предупреждения?
Эй, еще раз спасибо за ответ! Итак, в моем коде вторая функция была похожа на затенение первой? Если нет, то почему оболочка говорит, что строка 2 всегда будет соответствовать? – dotslash
О, возможно, предупреждение состояло в том, что новая функция сгенерировала два предложения, первая из которых была затенена функцией, определенной ранее. Это может объяснить это ... – dotslash
Да, вторая создала 1 функцию arity, которая никогда не могла соответствовать из-за первой функции, которую вы определили. – Dogbert