функция def конфликтует, добавив необязательный параметр elixir - PullRequest
1 голос
/ 25 сентября 2019

Функция hello не имеет никаких конфликтов и работает отлично.

defmodule User do
  defstruct [:name]
end

defmodule Greeter do
  def hello(%User{} = user) do
    "Hello #{user.name}"
  end

  def hello(name) do
    "Hello #{name}"
  end
end

Но если я добавлю необязательный параметр в первую функцию, я получу ошибку конфликта.

...
  def hello(%User{} = user, opts \\ []) do
    "Hello #{user.name}"
  end
...

Ошибка def hello/1 conflicts with defaults from hello/2

Кто-нибудь может объяснить, почему и как это имеет смысл?

1 Ответ

4 голосов
/ 25 сентября 2019

def hello / 1 конфликтует со значениями по умолчанию от hello / 2

Это означает, что компилятор не знает, означает ли hello("foo"):

  • Вызовите hello/1 с "foo" в качестве аргумента.
  • Вызовите hello/2 с "foo" в качестве первого аргумента и вторым аргументом по умолчанию.

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

Сначала можно объявить сигнатуру функции со значением по умолчанию, а затем определить реализации, которые используют это значение по умолчанию.Я думаю, что лучше всего иметь одно определение конечного результата, которое возвращает "Hello #{name}", и включить это поведение в другое предложение функции:

def hello(user, opts \\ [])
def hello(%User{name: name}, opts), do: hello(name, opts)
def hello(name, _opts), do: "Hello #{name}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...