差异确定并结束[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 ... endcond ... endreceive ... [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}包含有效的响应,因此很容易匹配。

    链接地址: http://www.djcxy.com/p/66289.html

    上一篇: Difference ok and end [Erlang]

    下一篇: Why is f(i =