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

Syntax when pattern matching with tuples (Elixir)

我正在学习教程,但有一个我不确定的基本语法问题。

有时当我们进行模式匹配时(比如函数参数),我们使用 = 并从左到右匹配。

但是,有时我会看到 -> 而不是 =。例如这段代码:

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

我假设这是错误的:

receive do {:result, filename} = filename do

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

我是这么想的。您可以对 "deconstruct" 数据使用模式匹配,如:

 [x|xs] = mylist

您正在获取一个对象并查看其结构,因此您可以访问其组件。这就是使用 = 的地方。

对于 receivecase _ do,您正在查看 "making decisions" 或 "control flow",这取决于您正在处理的数据的结构。在您的接收示例中,您计划 return 文件名,如果收到的消息是 "ok"。

Does this have to do with an anonymous function?

没有。

Or maybe a special syntax for tuples(which are basically maps?)

完全没有:)

= 是一个匹配运算符,意味着 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 被抛出。因此 = 可能被视为 完全匹配!-> 被视为 至少匹配其中一项并执行右侧所述的操作->.

一侧

旁注:“基本上是映射的元组”元组绝不是映射。