當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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)。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。