Функция имеет несколько предложений, а также объявляет значения по умолчанию. - PullRequest
0 голосов
/ 20 сентября 2018

Вот мой модуль:

defmodule Test do
  def try(10 = num, other_num \\ 10) do
    num + other_num
  end
  def try(_num, _other_num) do
    raise "This is incorrect"
  end
end

Когда я запускаю iex, я получаю это предупреждение:

warning: def try/2 has multiple clauses and also declares default values. In such cases, the default values should be defined in a header. 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

Я, честно говоря, понятия не имею, что это пытается сказать мнеделать.Может ли кто-нибудь разбить это для меня, что компилятор хочет, чтобы я сделал здесь?Спасибо!

1 Ответ

0 голосов
/ 20 сентября 2018

Компилятор хочет, чтобы вы написали заголовок функции (то есть функцию без тела), где вы указываете значение по умолчанию.

def try(num, other_num \\ 10)
def try(10 = num, other_num) do
  num + other_num
end
def try(_num, _other_num) do
  raise "This is incorrect"
end

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

def a(b, c \\ 10), do: b + c

компилируется в:

def a(b), do: a(b, 10)
def a(b, c), do: b + c

Нет простого перевода, когда функция задает разные значения по умолчанию:

def a(b, c \\ 10), do: b
def a(b, c \\ 20), do: c
...