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


Elixir Kernel.def用法及代碼示例


Elixir語言中 Kernel.def 相關用法介紹如下。

用法:

def(call, expr \\ nil)
(宏)

定義具有給定名稱和主體的公共函數。

例子

defmodule Foo do
  def bar, do: :baz
end

Foo.bar()
#=> :baz

需要參數的函數可以定義如下:

defmodule Foo do
  def sum(a, b) do
    a + b
  end
end

在上麵的例子中,定義了一個sum/2函數;這個函數接收兩個參數並返回它們的總和。

默認參數

\\ 用於指定函數參數的默認值。例如:

defmodule MyMath do
  def multiply_by(number, factor \\ 2) do
    number * factor
  end
end

MyMath.multiply_by(4, 3)
#=> 12

MyMath.multiply_by(4)
#=> 8

編譯器將此轉換為具有不同參數的多個函數,此處為 MyMath.multiply_by/1MyMath.multiply_by/2 ,它們表示傳遞或不傳遞具有默認值的參數的參數的情況。

在使用默認參數以及多個顯式聲明的子句定義函數時,您必須編寫一個聲明默認值的函數頭。例如:

defmodule MyString do
  def join(string1, string2 \\ nil, separator \\ " ")

  def join(string1, nil, _separator) do
    string1
  end

  def join(string1, string2, separator) do
    string1 <> separator <> string2
  end
end

請注意,\\ 不能與匿名函數一起使用,因為它們隻能具有唯一的元數。

具有默認參數的關鍵字列表

包含許多參數的函數可以受益於使用 Keyword 列表將屬性分組並作為單個值傳遞。

defmodule MyConfiguration do
  @default_opts [storage: "local"]

  def configure(resource, opts \\ []) do
    opts = Keyword.merge(@default_opts, opts)
    storage = opts[:storage]
    # ...
  end
end

使用 Map Keyword 存儲許多參數之間的區別是 Keyword 的鍵:

  • 必須是原子
  • 可以多次給予
  • 按照開發商的規定排序

函數和變量名

函數和變量名稱具有以下語法:lowercase ASCII letterunderscore 後跟任意數量的 lowercase or uppercase ASCII lettersnumbersunderscores 。或者,它們可以以 exclamation markquestion mark 結尾。

對於變量,任何以下劃線開頭的標識符都應指示未使用的變量。例如:

def foo(bar) do
  []
end
#=> warning: variable bar is unused

def foo(_bar) do
  []
end
#=> no warning

def foo(_bar) do
  _bar
end
#=> warning: the underscored variable "_bar" is used after being set

rescue /catch /after /else

函數體支持 rescuecatchafterelse ,就像 Kernel.SpecialForms.try/1 一樣(稱為 "implicit try")。例如,以下兩個函數是等價的:

def convert(number) do
  try do
    String.to_integer(number)
  rescue
    e in ArgumentError -> {:error, e.message}
  end
end

def convert(number) do
  String.to_integer(number)
rescue
  e in ArgumentError -> {:error, e.message}
end

相關用法


注:本文由純淨天空篩選整理自elixir-lang.org大神的英文原創作品 Kernel.def(call, expr \\ nil)。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。