Вывод эликсира в анонимную функцию - PullRequest
0 голосов
/ 18 марта 2019

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

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

Ответы [ 2 ]

1 голос
/ 19 марта 2019

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

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

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

foo / bar
** (BadFunctionError), ожидаемый aфункция, полученная:: ok
(elixir) lib / enum.ex: 769: Enum. "- каждый / 2-списки ^ 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.

0 голосов
/ 18 марта 2019

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

Enum.__info__(:functions) |> Enum.each(print)
...