gpt4 book ai didi

erlang - 区别 ok 和 end [Erlang]

转载 作者:行者123 更新时间:2023-12-03 21:34:50 24 4
gpt4 key购买 nike

在 Erlang 中用 end 和 ok 结束函数有什么区别?我一直在尝试理解以下代码中的含义:

-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()。然后我想我可以用 end 结束每个函数,但是如果我用 end 替换 ok,start(Par) 会出错。不仅如此,在服务器文件中,我看到 ok 和 end 在函数中用于结束循环。它们的使用方式在我看来是一样的,但它们显然实现了一个单独的功能,因为一个不能被另一个替代。一些澄清将不胜感激。

最佳答案

要理解的两点:

  • Erlang 中的某些代码块类型以“结束”结尾。所以if ... end , case ... 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”部分出现在元组中。例如,您可以在任何 dict-type 处理库中看到这一点。某些数据返回函数的返回类型为 {ok, Value} | {error, Reason} 的原因而不仅仅是 Value | {error, Reason}就是让模式匹配更自然。
    考虑以下 case 子句:
    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} 中。所以很容易匹配。

    关于erlang - 区别 ok 和 end [Erlang],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26920673/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com