当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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