差异确定并结束[Erlang]
在Erlang结束一个函数结束和确定的区别是什么? 我一直在努力去掌握以下代码中的含义:
-module(esOne).
-export([start/1, func/1]).
start(Par) ->
io:format("Client: I am ~p, spawned by the server: ~p~n",[self(),Par]),
spawn(esOne, func, [self()]),
Par ! {onPid, self()},
serverEsOne ! {onName, self()},
receiveMessage(),
ok.
receiveMessage() ->
receive
{reply, N} ->
io:format("Client: I received a message: ~p~n",[N])
after
5000->
io:format("Client: I received no message, i quit~n",[])
end.
func(Parent)->
io:format("Child: I am ~p, spawned from ~p~n",[self(),Parent]).
此代码与另一个作为服务器的.erl文件结合使用。 我设法通过分析给定的服务器文件并复制它的行为来写这个。 首先,我认为ok是用来结束每个函数的,但事实并非如此,因为我不能用ok结束receiveMessage()。 然后,我想我可能会结束每一个功能,但如果我更换结束,开始(Par)会给出错误。 不仅如此,在服务器文件中,我看到ok和end在函数中用于结束循环。 他们的使用方式对我来说看起来是一样的,但他们显然履行了独立的功能,因为一个人不能被另一个替代。 一些澄清将不胜感激。
有两点要了解:
Erlang中的一些代码块类型用“结束”关闭。 所以if ... end
, cond ... end
, receive ... [after N] ... end
等等。 当然,可以使用“end”作为自己的原子代替OK,但这不是上述情况。
Erlang中的每个函数都返回一些值。 如果你不清楚它,它会返回最后一个表达式的值。 “=”运算符不像其他语言那样赋值给变量,它与数学赋值符号一样,这意味着重新赋值实际上是一个逻辑断言。 如果断言失败,则进程抛出异常(通常意味着它崩溃)。
当你用“ok”或任何其他原子结束某些东西时,你会提供一个将返回的已知最终值。 你不需要做任何事情,但是如果你想让调用进程声明函数完成或崩溃,如果发生任何异常,那么你可以:
do_stuff() ->
ok = some_func().
代替
do_stuff() ->
some_func().
如果some_func()可能有可能失败的副作用,它通常会返回ok
或{error, Reason}
(或类似的东西)。 通过检查返回是否ok
如果发生不良情况,我们会阻止调用进程继续执行。 这是Erlang概念“让它崩溃”的核心。 基本的想法是,如果你调用一个有副作用的函数,并且它做了任何意想不到的事情,那么你应该立即崩溃,因为处理不好的数据比根本不进行更糟。 主管将清理死机,系统将恢复到已知状态,而不是处于副作用失效后留下的随机状态。
如果函数的目的是返回一个值,那么上面的一个变体就是让“ok”部分出现在一个元组中。 例如,你可以在任何字典类型的处理库中看到它。 某些数据返回函数的返回类型为{ok, Value} | {error, Reason}
{ok, Value} | {error, Reason}
而不是Value | {error, Reason}
Value | {error, Reason}
是使模式匹配更自然。
考虑以下案例条款:
case dict:find(Key, Dict) of
{ok, Value} ->
Value;
{error, Reason} ->
log(error, Reason),
error
end.
和:
case finder(Key, Struct) of
Value ->
Value;
{error, Reason}
log(error, Reason),
error
end.
在第一个例子中,我们首先匹配成功条件。 然而,在第二个版本中,这是不可能的,因为错误条款永远不会匹配; 任何回报都将始终由Value
来表示。 哎呀。
大多数时间(但不是总是)返回值或崩溃的函数将返回值。 这对纯粹的函数来说尤其如此,它不带任何状态,而是传入并且没有任何副作用(例如, dict:fetch/2
直接给出值,或者使调用过程崩溃,给你一个简单的选择,你想要哪种方式做事情)。 返回值或发出错误的函数通常在{ok, Value}
包含有效的响应,因此很容易匹配。
上一篇: Difference ok and end [Erlang]
下一篇: Why is f(i =