以Erlang表示的连接

flmtquvp  于 2022-12-08  发布在  Erlang
关注(0)|答案(2)|浏览(136)

我试图解决的问题如下:
编写一个名为print_message的Erlang函数,该函数不带参数。该函数应该等待接收消息。当接收到消息时(可以是任何Erlang术语),使用io打印消息:format()。如果42秒后仍未收到消息,则打印一条消息,说明“太晚了"。
我为这个问题编写的代码如下:

print_message() ->
      receive
       X -> io:format("~p~n",[X])
    after 42000 ->
       io:format("Too late ~n")
    end.

在我的问题中,它说“它可以是任何Erlang术语”。在我的代码中使用X是否满足该要求?或者我是否需要使用任何()的Erlang内置函数,如下面参考手册中所述:是吗?

oiopk7p5

oiopk7p51#

您的代码满足要求。
Erlang是动态类型的,所以X的类型只在接收到第一条消息时才确定,因此它可以是任何Erlang项。
据我所知,我认为不可能在代码中指定X的类型。
它在Erlang中存在一些类型规范,但它用于函数参数、它们的返回值和记录定义。
这些类型定义可以在以后用于文档或由dialyzer使用

pinkon5k

pinkon5k2#

是的,您的代码满足要求。模式X匹配任何Erlang术语。
请与以下代码进行比较,该代码仅在传入消息是以ok开头的2元组时匹配:

print_message() ->
    receive
        {ok, X} ->

或者使用以下语句(仅当传入消息为整数时才匹配):

print_message() ->
    receive
        X when is_integer(X) ->

或者使用this,它只在传入消息等于函数参数时才匹配:

print_message(X) ->
    receive
        X ->

(由于变量名相同,因此这将变成选择性receive,其中所有其他消息都将被忽略。)
类型规范是Erlang语言的可选部分。您可以指定函数接受整数并返回字符串:

-spec my_function(integer()) -> string().
my_function(N) ->
    ....

然后您可以使用透析器检查类型错误。
但是,类型规范只在编译时使用;它们在运行时实际上不执行任何检查。此外,它们不能用于指定发送或接收的消息的类型;只涉及函数参数和返回值。

相关问题