当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Elixir Kernel.SpecialForms.case用法及代码示例


Elixir语言中 Kernel.SpecialForms.case 相关用法介绍如下。

用法:

case(condition, clauses)
(宏)

将给定的表达式与给定的子句匹配。

例子

case File.read(file) do
  {:ok, contents} when is_binary(contents) ->
    String.split(contents, "\n")

  {:error, _reason} ->
    Logger.warning "could not find #{file}, assuming empty..."
    []
end

在上面的示例中,我们将 File.read/1 的结果与每个子句 "head" 进行匹配,并执行与匹配的第一个子句相对应的子句 "body"。

如果没有子句匹配,则会引发错误。出于这个原因,可能需要添加一个始终匹配的最终 catch-all 子句(如 _ )。

x = 10

case x do
  0 ->
    "This clause won't match"

  _ ->
    "This clause would match any value (x = #{x})"
end
#=> "This clause would match any value (x = 10)"

变量处理

请注意,绑定在子句中的变量不会泄漏到外部上下文:

case data do
  {:ok, value} -> value
  :error -> nil
end

value
#=> unbound variable value

外部上下文中的变量也不能被覆盖:

value = 7

case lucky? do
  false -> value = 13
  true -> true
end

value
#=> 7

在上面的示例中,无论 lucky? 的值如何,value 都将是 7。子句中绑定的变量value 和外部上下文中绑定的变量value 是两个完全独立的变量。

如果要对现有变量进行模式匹配,则需要使用 ^/1 运算符:

x = 1

case 10 do
  ^x -> "Won't match"
  _ -> "Will match"
end
#=> "Will match"

使用警卫匹配多个值

虽然不可能在单个子句中匹配多个模式,但可以通过使用守卫匹配多个值:

case data do
  value when value in [:one, :two] ->
    "#{value} has been matched"

  :three ->
    "three has been matched"
end

相关用法


注:本文由纯净天空筛选整理自elixir-lang.org大神的英文原创作品 Kernel.SpecialForms.case(condition, clauses)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。