В настоящее время я изучаю эликсир и пытаюсь распечатать функции и их арность.
print = fn ({function , arity}) ->
IO.puts "#{function}/#{arity}"
end
Enum.__info__(:functions) |> Enum.each(print.())
это возвращает
** (BadArityError) #Function<0.60149952 in file:learn.exs> with arity 1 called with no arguments
learn.exs:5: (file)
(elixir) lib/code.ex:767: Code.require_file/2
Ваша проблема в том, как вы передаете print
в Enum.each
. Переменная print
уже привязана к функции. Когда вы делаете print.()
, вы вызываете эту функцию без аргументов и передаете результат Enum.each
. Вместо этого вы хотите передать саму функцию print
в качестве аргумента Enum.each
. Так:
Enum.__info__(:functions) |> Enum.each(print)
Пожалуйста, начните конвейер с термина, как это предлагается в руководстве: :functions |> Enum.__info__() |> Enum.each(print)
особенно при ответах на вопросы. Научим новичков хорошим привычкам :)
Средство форматирования не требует запуска конвейеров с термином, поэтому ИМО это допустимо. Кроме того, я думаю, что в этом случае это более читабельно.
Чтобы добавить к тому, что сказал Павел Оброк, причина, по которой это возвращает BadArityError
, заключается в том, что print.()
вызывает вашу функцию print
без аргументов, но ожидает кортеж в качестве аргумента.
На самом деле это маскирует реальную проблему — вы вызываете функцию, а не передаете ее в качестве аргумента. Если вы передаете функцию print.()
, вызывающую кортеж, таким образом разрешая BadArityError
, вы получаете реальную ошибку:
Enum.__info__(:functions) |> Enum.each(print.({:foo, :bar}))
foo/bar
** (BadFunctionError) expected a function, got: :ok
(elixir) lib/enum.ex:769: Enum."-each/2-lists^foreach/1-0-"/2
(elixir) lib/enum.ex:769: Enum.each/2
Функция print
выполняется, выполняя IO.puts "#{function}/#{arity}"
, как вы можете видеть из вывода foo/bar
, затем возвращает результат IO.puts/1
, который равен :ok
, и передает его в качестве второго аргумента Enum.each
. Это вызывает BadFunctionError
, потому что Enum.each
ожидает функцию в качестве второго аргумента, но вы дали результат выполнения функции — атом :ok
.
mix format
в проекте или плагине к вашему редактору.