我在跟着一个教程学习,有一个基本的语法问题,我不清楚。
有时我们在模式匹配时(比如说函数参数),我们使用了 =
并将左边与右边相匹配。
然而,有时我看到 ->
被用来代替 =
. 比如这段代码。
receive do {:result, filename} -> filename do
我想这是错误的
receive do {:result, filename} = filename do
这是否与匿名函数有关? 或者是tuple的特殊语法(基本上是映射?)。
这和匿名函数有关系吗?
没有。
或者是tuple的特殊语法(基本上是映射?
完全没有:)
=
是一个匹配操作符,意思是RHO必须匹配LHO,否则。MatchError
是提出。
{:ok, _} = {:ok, 42}
#⇒ {:ok, 42}
{:ok, _} = :error
** (MatchError) no match of right hand side value: :error
->
应改为 "如果根据上下文的情况,从外部范围的某种程度上,是匹配到LHO,评估RHO。"
case :error do
{:ok, _} -> :never_reached
_ -> :we_matched_error_through_match_all_clause
end
#⇒ :we_matched_error_through_match_all_clause
¡NB! 请注意(感谢Diego Echeverri在评论中提到这一点),如果没有一个子句成功地匹配了 ->
例如: MatchError
是抛出的。所以 =
可视作 正合 而 ->
作为 至少要符合其中之一,并按照右边的说法去做。->
.
旁注。 "元组基本上是地图 "元组并不意味着是地图.
我是这样想的。你可以使用模式匹配来 "解构 "数据,如。
[x|xs] = mylist
你得到一个对象,然后窥视它的结构, 所以你可以访问它的组件。这就是 =
是使用。
对于 receive
和 case _ do
你正在寻找 "决策 "或 "控制流",基于你正在操作的数据的结构。在你的receive例子中,你计划返回文件名,如果收到的消息是 "ok"。