📅  最后修改于: 2020-11-04 08:26:42             🧑  作者: Mango
函数是一起组织以执行特定任务的一组语句。编程中的函数工作原理与Math中的函数相似。给函数一些输入,它们根据提供的输入生成输出。
Elixir中有2种功能-
使用fn..end构造定义的函数是匿名函数。这些功能有时也称为lambda。通过将它们分配给变量名称来使用它们。
使用def关键字定义的函数称为函数。这些是Elixir中提供的本机函数。
顾名思义,匿名函数没有名称。这些经常传递给其他功能。要在Elixir中定义匿名函数,我们需要fn和end关键字。在这些函数,我们可以定义由->分隔的任意数量的参数和函数体。例如,
sum = fn (a, b) -> a + b end
IO.puts(sum.(1, 5))
当运行以上程序时,运行时,会产生以下结果-
6
请注意,这些函数的命名方式与命名函数不同。我们有一个’ 。在函数名称及其参数之间。
我们还可以使用捕获运算符定义这些函数。这是创建函数的简便方法。现在,我们将使用capture运算符定义上述sum函数,
sum = &(&1 + &2)
IO.puts(sum.(1, 2))
当上述程序运行时,它产生以下结果-
3
在简写版本中,我们的参数未命名,但可以用&1,&2,&3等方式使用。
模式匹配不仅限于变量和数据结构。我们可以使用模式匹配使函数多态。例如,我们将声明一个可以接受1或2个输入(在一个元组内)并将其打印到控制台的函数,
handle_result = fn
{var1} -> IO.puts("#{var1} found in a tuple!")
{var_2, var_3} -> IO.puts("#{var_2} and #{var_3} found!")
end
handle_result.({"Hey people"})
handle_result.({"Hello", "World"})
运行上述程序时,将产生以下结果-
Hey people found in a tuple!
Hello and World found!
我们可以使用名称定义函数,以便以后可以轻松引用它们。命名函数是使用def关键字在模块内定义的。命名函数始终在模块中定义。要调用命名函数,我们需要使用其模块名称来引用它们。
以下是命名函数的语法-
def function_name(argument_1, argument_2) do
#code to be executed when function is called
end
现在让我们在Math模块中定义命名函数的和。
defmodule Math do
def sum(a, b) do
a + b
end
end
IO.puts(Math.sum(5, 6))
当运行上述程序时,它产生以下结果-
11
对于1-liner函数,使用do:来定义这些函数的简写形式。例如-
defmodule Math do
def sum(a, b), do: a + b
end
IO.puts(Math.sum(5, 6))
当运行上述程序时,它产生以下结果-
11
Elixir为我们提供了定义私有功能的能力,这些私有功能可以从定义它们的模块中访问。要定义私有函数,请使用defp而不是def 。例如,
defmodule Greeter do
def hello(name), do: phrase <> name
defp phrase, do: "Hello "
end
Greeter.hello("world")
运行上述程序时,将产生以下结果-
Hello world
但是,如果我们只是尝试使用Greeter.phrase()函数显式调用短语函数,则会引发错误。
如果我们想要参数的默认值,我们使用参数\\ value语法-
defmodule Greeter do
def hello(name, country \\ "en") do
phrase(country) <> name
end
defp phrase("en"), do: "Hello, "
defp phrase("es"), do: "Hola, "
end
Greeter.hello("Ayush", "en")
Greeter.hello("Ayush")
Greeter.hello("Ayush", "es")
运行上述程序时,将产生以下结果-
Hello, Ayush
Hello, Ayush
Hola, Ayush