使用元组进行模式匹配时的语法 (Elixir)

问题描述 投票:0回答:1

我在跟着一个教程学习,有一个基本的语法问题,我不清楚。

有时我们在模式匹配时(比如说函数参数),我们使用了 = 并将左边与右边相匹配。

然而,有时我看到 -> 被用来代替 =. 比如这段代码。

receive do {:result, filename} -> filename do

我想这是错误的

receive do {:result, filename} = filename do

这是否与匿名函数有关? 或者是tuple的特殊语法(基本上是映射?)。

elixir phoenix-framework
1个回答
3
投票

这和匿名函数有关系吗?

没有。

或者是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 是抛出的。所以 = 可视作 正合-> 作为 至少要符合其中之一,并按照右边的说法去做。->.


旁注。 "元组基本上是地图 "元组并不意味着是地图.


1
投票

我是这样想的。你可以使用模式匹配来 "解构 "数据,如。

 [x|xs] = mylist

你得到一个对象,然后窥视它的结构, 所以你可以访问它的组件。这就是 = 是使用。

对于 receivecase _ do你正在寻找 "决策 "或 "控制流",基于你正在操作的数据的结构。在你的receive例子中,你计划返回文件名,如果收到的消息是 "ok"。

© www.soinside.com 2019 - 2024. All rights reserved.