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