与元组进行模式匹配时的语法 (Elixir)
Syntax when pattern matching with tuples (Elixir)
我正在学习教程,但有一个我不确定的基本语法问题。
有时当我们进行模式匹配时(比如函数参数),我们使用 =
并从左到右匹配。
但是,有时我会看到 ->
而不是 =
。例如这段代码:
receive do {:result, filename} -> filename do
我假设这是错误的:
receive do {:result, filename} = filename do
这与匿名函数有关吗?或者元组的特殊语法(基本上是映射?)。
我是这么想的。您可以对 "deconstruct" 数据使用模式匹配,如:
[x|xs] = mylist
您正在获取一个对象并查看其结构,因此您可以访问其组件。这就是使用 =
的地方。
对于 receive
和 case _ 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
被抛出。因此 =
可能被视为 完全匹配! 和 ->
被视为 至少匹配其中一项并执行右侧所述的操作->
.
一侧
旁注:“基本上是映射的元组”元组绝不是映射。
我正在学习教程,但有一个我不确定的基本语法问题。
有时当我们进行模式匹配时(比如函数参数),我们使用 =
并从左到右匹配。
但是,有时我会看到 ->
而不是 =
。例如这段代码:
receive do {:result, filename} -> filename do
我假设这是错误的:
receive do {:result, filename} = filename do
这与匿名函数有关吗?或者元组的特殊语法(基本上是映射?)。
我是这么想的。您可以对 "deconstruct" 数据使用模式匹配,如:
[x|xs] = mylist
您正在获取一个对象并查看其结构,因此您可以访问其组件。这就是使用 =
的地方。
对于 receive
和 case _ 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
被抛出。因此 =
可能被视为 完全匹配! 和 ->
被视为 至少匹配其中一项并执行右侧所述的操作->
.
旁注:“基本上是映射的元组”元组绝不是映射。