Ошибка компиляции: "определения с несколькими предложениями и значениями по умолчанию требуют функции head"

Я использую следующий код, пытаясь решить Étude 3-1: Pattern Matching из книги этюды для Elixir.

16   def area(:rectangle, a \ 1, b \ 1) do
17     a * b
18   end
19
20   def area(:triangle, a, b) do
21     a * b / 2.0
22   end
23
24   def area(:shape, a, b) do
25     a * b * :math.pi()
26   end

и я получаю следующую ошибку:

** (CompileError) geom.ex:20: definitions with multiple clauses and default values require a function head.

есть объяснение сразу после сообщения об ошибке:

Instead of:

    def foo(:first_clause, b \ :default) do ... end
    def foo(:second_clause, b) do ... end

one should write:

    def foo(a, b \ :default)
    def foo(:first_clause, b) do ... end
    def foo(:second_clause, b) do ... end    

def area/3 has multiple clauses and defines defaults in a clause with a body
    geom.ex:20: (module)
    (stdlib) erl_eval.erl:670: :erl_eval.do_apply/6

видимо, я не могу использовать значения по умолчанию: получил его. Но почему?

1 ответов


вы действительно можете использовать значения по умолчанию, но, как показывает сообщение об ошибке, вам нужно указать функциональную головку:

14   def area(shape, a \ 1, b \ 1)
15
16   def area(:rectangle, a, b) do
17     a * b
18   end
19
20   def area(:triangle, a, b) do
21     a * b / 2.0
22   end
23
24   def area(:shape, a, b) do
25     a * b * :math.pi()
26   end

Примечание строка 14, указывающая необходимую функциональную головку.

от https://elixirschool.com/lessons/basics/functions/: Elixir не любит аргументы по умолчанию в нескольких соответствующих функциях, это может быть запутанным. Для этого мы добавляем функцию head с нашими аргументами по умолчанию