2016-08-09 5 views
2

Я получаю то, что считаю довольно странным предупреждением при попытке скомпилировать модуль 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 

Что же тогда смысл этого предупреждения?

ответ

3

Проблема заключается в том, что def fall_velocity(distance, gravity \\ 9.8) do определит 2 функции, одну с арностью 1, которая просто падает на версию arity 2 с коэффициентом силы тяжести, равным 9,8, и с аркой 2. В этом случае вам не нужно первое предложение вообще. Второй установит силу тяжести до 9,8 по умолчанию, и вы получите тот же ответ, что и arity 1.

defmodule Drop do 
    def fall_velocity(distance, gravity \\ 9.8) do 
    :math.sqrt(2 * gravity * distance) 
    end 
end 
+0

Эй, еще раз спасибо за ответ! Итак, в моем коде вторая функция была похожа на затенение первой? Если нет, то почему оболочка говорит, что строка 2 всегда будет соответствовать? – dotslash

+0

О, возможно, предупреждение состояло в том, что новая функция сгенерировала два предложения, первая из которых была затенена функцией, определенной ранее. Это может объяснить это ... – dotslash

+1

Да, вторая создала 1 функцию arity, которая никогда не могла соответствовать из-за первой функции, которую вы определили. – Dogbert

Смежные вопросы