我试图解决的问题如下:
编写一个名为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内置函数,如下面参考手册中所述:是吗?
2条答案
按热度按时间oiopk7p51#
您的代码满足要求。
Erlang是动态类型的,所以X的类型只在接收到第一条消息时才确定,因此它可以是任何Erlang项。
据我所知,我认为不可能在代码中指定X的类型。
它在Erlang中存在一些类型规范,但它用于函数参数、它们的返回值和记录定义。
这些类型定义可以在以后用于文档或由dialyzer使用
pinkon5k2#
是的,您的代码满足要求。模式
X
匹配任何Erlang术语。请与以下代码进行比较,该代码仅在传入消息是以
ok
开头的2元组时匹配:或者使用以下语句(仅当传入消息为整数时才匹配):
或者使用this,它只在传入消息等于函数参数时才匹配:
(由于变量名相同,因此这将变成选择性
receive
,其中所有其他消息都将被忽略。)类型规范是Erlang语言的可选部分。您可以指定函数接受整数并返回字符串:
然后您可以使用透析器检查类型错误。
但是,类型规范只在编译时使用;它们在运行时实际上不执行任何检查。此外,它们不能用于指定发送或接收的消息的类型;只涉及函数参数和返回值。