Вывод эликсира в анонимную функцию

В настоящее время я изучаю эликсир и пытаюсь распечатать функции и их арность.

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

person Cheeze    schedule 18.03.2019    source источник
comment
Примечание: используйте formatter для форматирования кода. mix format в проекте или подключаемом модуле к выбранному вами редактору.   -  person Aleksei Matiushkin    schedule 19.03.2019


Ответы (2)


Ваша проблема в том, как вы передаете print в Enum.each. Переменная print уже привязана к функции. Когда вы делаете print.(), вы вызываете эту функцию без аргументов и передаете результат Enum.each. Вместо этого вы хотите передать саму функцию print в качестве аргумента функции Enum.each. Так:

Enum.__info__(:functions) |> Enum.each(print)
person Paweł Obrok    schedule 18.03.2019
comment
Пожалуйста, начните конвейер с термина в соответствии с рекомендациями: :functions |> Enum.__info__() |> Enum.each(print) особенно при ответах на вопросы. Научим новичков хорошим привычкам :) - person Aleksei Matiushkin; 19.03.2019
comment
Средство форматирования не требует запуска конвейеров с термином, поэтому ИМО это допустимо. Кроме того, я думаю, что в этом случае это более читабельно. - person Paweł Obrok; 19.03.2019

Чтобы добавить к тому, что сказал Павел Оброк, причина, по которой это возвращает BadArityError, заключается в том, что print.() вызывает вашу функцию print без аргументов, но ожидает кортеж в качестве своего аргумента.

На самом деле это маскирует реальную проблему — вы вызываете функцию, а не передаете ее в качестве аргумента. Если вы передаете функцию print.(), вызывающую кортеж, таким образом разрешая BadArityError, вы получаете реальную ошибку:

Enum.__info__(:functions) |> Enum.each(print.({:foo, :bar}))

foo/bar
** (BadFunctionError) ожидал функцию, получил: :ok
(elixir) lib/enum.ex:769: Enum."-each/2-lists^foreach/1-0-" /2
(эликсир) lib/enum.ex:769: Enum.each/2

Функция print выполняется, выполняя IO.puts "#{function}/#{arity}", как вы можете видеть из вывода foo/bar, затем возвращает результат IO.puts/1, который равен :ok, и передает его в качестве второго аргумента в Enum.each. Это вызывает BadFunctionError, потому что Enum.each ожидает функцию в качестве второго аргумента, но вы дали результат выполнения функции - атом :ok.

person Adam Millerchip    schedule 19.03.2019