Datetime 为什么init:stop()不直接终止?
我的代码用于显示今年的所有日期 我不明白为什么Datetime 为什么init:stop()不直接终止?,datetime,erlang,Datetime,Erlang,我的代码用于显示今年的所有日期 我不明白为什么如果NewSec=init:stop()end没有在运行日历中第一次执行 我希望init:stop()可以第一次执行,但事实并非如此 怎么了 代码: -module(cal). -export([main/0]). main() -> StartSec = calendar:datetime_to_gregorian_seconds({{2009,1,1},{0,0,0}}), EndSec = calendar:dateti
如果NewSec=init:stop()end
没有在运行日历中第一次执行
我希望init:stop()可以第一次执行,但事实并非如此怎么了 代码:
-module(cal).
-export([main/0]).
main() ->
StartSec = calendar:datetime_to_gregorian_seconds({{2009,1,1},{0,0,0}}),
EndSec = calendar:datetime_to_gregorian_seconds({{2009,12,31},{0,0,0}}),
run_calendar(StartSec,EndSec).
run_calendar(CurSec, EndSec) ->
{Date,_Time} = calendar:gregorian_seconds_to_datetime(CurSec),
io:format("~p~n", [Date]),
NewSec = CurSec + 60*60*24,
if NewSec =< EndSec -> init:stop() end,
run_calendar(NewSec, EndSec).
我相信init:stop()是一个异步进程,它将尝试平稳地关闭运行时。根据“在系统终止之前,所有应用程序都被顺利关闭,所有代码都被卸载,所有端口都被关闭。”
实际停止可能需要一段时间,因为您有一个正在运行的进程。如果将“init:stop()”更改为“exit(stop)”,它将立即终止:
3> cal:main().
{2009,1,1}
** exception exit: stop
in function cal:run_calendar/2
我相信init:stop()是一个异步进程,它将尝试平稳地关闭运行时。根据“在系统终止之前,所有应用程序都被顺利关闭,所有代码都被卸载,所有端口都被关闭。”
实际停止可能需要一段时间,因为您有一个正在运行的进程。如果将“init:stop()”更改为“exit(stop)”,它将立即终止:
3> cal:main().
{2009,1,1}
** exception exit: stop
in function cal:run_calendar/2
Init:stop是异步的,退出需要时间。另一种方法是在调用本身中结束测试,并使用模式匹配终止循环:
-module(cal).
-export([main/0]).
main() ->
StartSec = calendar:datetime_to_gregorian_seconds({{2009,1,1},{0,0,0}}),
EndSec = calendar:datetime_to_gregorian_seconds({{2009,12,31},{0,0,0}}),
run_calendar(false, StartSec, EndSec).
run_calendar(true, _StartSec, _EndSec) ->
finished;
run_calendar(false, CurSec, EndSec) ->
{Date,_Time} = calendar:gregorian_seconds_to_datetime(CurSec),
io:format("~p~n", [Date]),
NewSec = CurSec + 60*60*24,
run_calendar(NewSec =< EndSec, NewSec, EndSec).
-模块(校准)。
-导出([main/0])。
main()->
StartSec=日历:日期时间到公历秒({2009,1,1},{0,0,0}),
EndSec=日历:日期时间到公历秒({2009,12,31},{0,0,0}),
运行日历(false、StartSec、EndSec)。
运行日历(正确,开始,结束)->
完成;
运行日历(false、CurSec、EndSec)->
{Date,{u Time}=日历:公历秒到日期时间(CurSec),
io:格式(“~p~n,[Date]),
NewSec=CurSec+60*60*24,
运行日历(NewSec=
(或者类似的,希望你能理解)Init:stop是异步的,退出需要时间。另一种方法是在调用本身中结束测试,并使用模式匹配终止循环:
-module(cal).
-export([main/0]).
main() ->
StartSec = calendar:datetime_to_gregorian_seconds({{2009,1,1},{0,0,0}}),
EndSec = calendar:datetime_to_gregorian_seconds({{2009,12,31},{0,0,0}}),
run_calendar(false, StartSec, EndSec).
run_calendar(true, _StartSec, _EndSec) ->
finished;
run_calendar(false, CurSec, EndSec) ->
{Date,_Time} = calendar:gregorian_seconds_to_datetime(CurSec),
io:format("~p~n", [Date]),
NewSec = CurSec + 60*60*24,
run_calendar(NewSec =< EndSec, NewSec, EndSec).
-模块(校准)。
-导出([main/0])。
main()->
StartSec=日历:日期时间到公历秒({2009,1,1},{0,0,0}),
EndSec=日历:日期时间到公历秒({2009,12,31},{0,0,0}),
运行日历(false、StartSec、EndSec)。
运行日历(正确,开始,结束)->
完成;
运行日历(false、CurSec、EndSec)->
{Date,{u Time}=日历:公历秒到日期时间(CurSec),
io:格式(“~p~n,[Date]),
NewSec=CurSec+60*60*24,
运行日历(NewSec=
(或者类似的,希望你能理解)你的if语句有错误 你说 if NewSec =< EndSec -> init:stop() end, 如果NewSec=
init:stop()永远不会被调用…您的if语句中有一个错误 你说 if NewSec =< EndSec -> init:stop() end, 如果NewSec=
init:stop()永远不会被调用…即使你有一个“适合用途”的免责声明:“end”是一个关键字,如果你想将它作为一个原子,它必须是单引号。是的,我在我的示例中有null,我认为end在输出中会更好。Do'h我现在已经更改了它,尽管您有一个适合用途的免责声明:“end”是一个关键字,如果您想将其作为atom,则必须单引号引用。是的,我的示例中有null,并且认为end在输出中会更好。我现在已经更改了,为什么不将if改为不调用
run\u calendar/2
递归:if NewSec=ok;true->run_calendar(NewSec,EndSec)end.
你的程序将正常退出,不会出现奇怪的行为。为什么不将if更改为不调用run_calendar/2
递归:if NewSec=ok;true->run_calendar(NewSec,EndSec)end.
程序将正常退出,不会出现异常行为。