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)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。
