Erlang 试图使用计时器执行函数,但编译器说该函数未使用

Erlang 试图使用计时器执行函数,但编译器说该函数未使用,erlang,Erlang,我试图在几秒钟后使用timer:apply\u after()执行一个函数,但当我试图编译模块时,它抛出了一个错误 例如,假设我有一个模块,它有两个功能——一个打印年龄,另一个使用计时器在将来执行 -module(test). -export([main/0]). print_age(Age) -> io:format("Your age: ~p~n", [Age]). main() -> timer:apply_after(2000, test, print_age,

我试图在几秒钟后使用
timer:apply\u after()
执行一个函数,但当我试图编译模块时,它抛出了一个错误

例如,假设我有一个模块,它有两个功能——一个打印年龄,另一个使用
计时器在将来执行

-module(test).
-export([main/0]).

print_age(Age) ->
  io:format("Your age: ~p~n", [Age]).

main() ->
  timer:apply_after(2000, test, print_age, [20]).
当我编译模块时,我得到:

>c(测试)。
测试erl:4:警告:未使用功能打印/1
{好的,测试}

虽然中没有任何指示,但必须导出该函数,以便
计时器执行该函数:

-module(test).
-export([main/0, print_age/1]).

print_age(Age) ->
  io:format("Your age: ~p~n", [Age]).

main() ->
  timer:apply_after(2000, test, print_age, [20]).
可以通过将
-compile({nowarn\u unused\u function,{print\u age,1}}})添加到模块顶部来绕过编译器错误。
,但当计时器尝试执行该函数时,它将变成运行时错误:

=错误报告===2018年6月6日::13:37:14===
使用退出值处理时出错:
{未定义,[{测试,打印年龄,[20],]}
我不知道
timer
如何工作的所有内部细节,但指出它在
gen_服务器
的单独进程中运行

定时器模块是在单独进程中运行的标准gen_服务器。计时器模块中的所有函数都是公共接口,用于执行隐藏的gen_server:调用或gen_server:强制转换到计时器服务器。这是一种常见用法,用于隐藏服务器的内部,并允许在不影响现有应用程序的情况下进行进一步的改进


我想这是有道理的,因为当前进程必须能够继续执行代码,并且要执行的函数必须安全地存储在某个地方,直到延迟过去。由于一个模块只能访问另一个模块中已导出的函数,因此也必须导出要执行的函数。

虽然中没有任何指示,但必须导出该函数,以便
计时器执行该函数:

-module(test).
-export([main/0, print_age/1]).

print_age(Age) ->
  io:format("Your age: ~p~n", [Age]).

main() ->
  timer:apply_after(2000, test, print_age, [20]).
可以通过将
-compile({nowarn\u unused\u function,{print\u age,1}}})添加到模块顶部来绕过编译器错误。
,但当计时器尝试执行该函数时,它将变成运行时错误:

=错误报告===2018年6月6日::13:37:14===
使用退出值处理时出错:
{未定义,[{测试,打印年龄,[20],]}
我不知道
timer
如何工作的所有内部细节,但指出它在
gen_服务器
的单独进程中运行

定时器模块是在单独进程中运行的标准gen_服务器。计时器模块中的所有函数都是公共接口,用于执行隐藏的gen_server:调用或gen_server:强制转换到计时器服务器。这是一种常见用法,用于隐藏服务器的内部,并允许在不影响现有应用程序的情况下进行进一步的改进

我想这是有道理的,因为当前进程必须能够继续执行代码,并且要执行的函数必须安全地存储在某个地方,直到延迟过去。由于一个模块只能访问另一个模块中已导出的函数,因此要执行的函数也必须导出