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/1 和 MyMath.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 letter 或 underscore 後跟任意數量的 lowercase or uppercase ASCII letters 、 numbers 或 underscores 。或者,它們可以以 exclamation mark 或 question 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
函數體支持 rescue 、 catch 、 after 和 else ,就像   一樣(稱為 "implicit try")。例如,以下兩個函數是等價的:Kernel.SpecialForms.try/1 
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 Kernel.defexception用法及代碼示例
 - Elixir Kernel.defmodule用法及代碼示例
 - Elixir Kernel.defmacro用法及代碼示例
 - Elixir Kernel.defdelegate用法及代碼示例
 - Elixir Kernel.defguard用法及代碼示例
 - Elixir Kernel.defoverridable用法及代碼示例
 - Elixir Kernel.defstruct用法及代碼示例
 - Elixir Kernel.defp用法及代碼示例
 - Elixir Kernel.destructure用法及代碼示例
 - Elixir Kernel.div用法及代碼示例
 - Elixir Kernel.SpecialForms.case用法及代碼示例
 - Elixir Kernel.round用法及代碼示例
 - Elixir Kernel.left / right用法及代碼示例
 - Elixir Kernel.put_in用法及代碼示例
 - Elixir Kernel.tl用法及代碼示例
 - Elixir Kernel.left - right用法及代碼示例
 - Elixir Kernel.tuple_size用法及代碼示例
 - Elixir Kernel.to_charlist用法及代碼示例
 - Elixir Kernel.base ** exponent用法及代碼示例
 - Elixir Kernel.left !== right用法及代碼示例
 - Elixir Kernel.if用法及代碼示例
 - Elixir Kernel.spawn_monitor用法及代碼示例
 - Elixir Kernel.to_string用法及代碼示例
 - Elixir Kernel.length用法及代碼示例
 - Elixir Kernel.first..last用法及代碼示例
 
注:本文由純淨天空篩選整理自elixir-lang.org大神的英文原創作品 Kernel.def(call, expr \\ nil)。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。
