如何定义函数而不导出它们?

时间:2016-11-25 19:16:15

标签: erlang

我正在通过了解你一些Erlang ,在关于尾递归的讨论中,作者定义了两个函数:tail_fac/1tail_fac/2。该书提到只能导出tail_fac/1。如何定义一个函数,在这种情况下,tail_fac/2,而不导出它?我知道定义函数的唯一方法是-export([func_name/args])

当我尝试运行代码段时:

tail_fac(N) -> tail_fac(N,1).

tail_fac(0,Acc) -> Acc;
tail_fac(N,Acc) when N > 0 -> tail_fac(N-1,N*Acc).

我的linter说tail_fac/2未定义,即使我尝试在导出中定义它。

1 个答案:

答案 0 :(得分:3)

在Erlang中,您实际上可以使用-compile(export_all),它将导出所有您的函数,但it's not a good practice

这只是一个观点问题 - 在Ruby,Python或Elixir中,你必须明确告诉你想要保密的方法/功能。在Erlang中你只是做同样的事情,但有公共功能。

通常:导出具有较少参数的函数,这实际上是函数的包装器,它使用更多参数(累加器等)。

例如:

sum(N) -> sum(N, 0).
sum(0, Acc) -> Acc;
sum(N, Acc) -> sum(N - 1, Acc + N).

如果只导出sum/1,那就完全没了问题。您不希望使用sum/2来打扰最终用户。