功能( Functions)
函数是组合在一起执行特定任务的一组语句。 编程中的函数主要类似于Math中的函数。 您为函数提供一些输入,它们根据提供的输入生成输出。
Elixir有两种类型的功能 -
匿名功能
使用fn..end construct定义的fn..end construct是匿名函数。 这些函数有时也称为lambda。 通过将它们分配给变量名来使用它们。
命名功能
使用def keyword定义的函数是命名函数。 这些是Elixir中提供的本机功能。
匿名函数
顾名思义,匿名函数没有名称。 这些经常被传递给其他功能。 要在Elixir中定义匿名函数,我们需要fn和end关键字。 在这些中,我们可以定义由-》分隔的任意数量的参数和函数体。 例如,
sum = fn (a, b) -> a + b end
IO.puts(sum.(1, 5))
运行上面的程序运行时,会产生以下结果 -
6
请注意,这些函数不像命名函数那样被调用。 我们有' . '在函数名和它的参数之间。
使用捕获运算符
我们还可以使用捕获运算符定义这些函数。 这是一种更简单的创建函数的方法。 我们现在将使用捕获运算符定义上面的sum函数,
sum = &(&1 + &2)
IO.puts(sum.(1, 2))
运行上述程序时,会生成以下结果 -
3
在简写版本中,我们的参数未命名,但我们可以使用&1,&2和&3等等。
模式匹配功能 (Pattern Matching Functions)
模式匹配不仅限于变量和数据结构。 我们可以使用模式匹配来使我们的函数具有多态性。 例如,我们将声明一个可以接受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!
Named 函数
我们可以使用名称定义函数,以便稍后我们可以轻松地引用它们。 命名函数使用def关键字在模块中定义。 命名函数始终在模块中定义。 要调用命名函数,我们需要使用它们的模块名称来引用它们。
以下是命名函数的语法 -
def function_name(argument_1, argument_2) do
#code to be executed when function is called
end
现在让我们在Math模块中定义命名函数sum。
defmodule Math do
def sum(a, b) do
a + b
end
end
IO.puts(Math.sum(5, 6))
在程序上运行时,会产生以下结果 -
11
对于单线函数,有一个简写符号来定义这些函数,使用do: . 例如 -
defmodule Math do
def sum(a, b), do: a + b
end
IO.puts(Math.sum(5, 6))
在程序上运行时,会产生以下结果 -
11
私有函数 (Private Functions)
Elixir使我们能够定义可以从定义它们的模块中访问的私有函数。 要定义私有函数,请使用defp而不是def 。 例如,
defmodule Greeter do
def hello(name), do: phrase <> name
defp phrase, do: "Hello "
end
Greeter.hello("world")
运行上述程序时,会产生以下结果 -
Hello world
但是如果我们只是尝试使用Greeter.phrase()函数显式调用短语函数,则会引发错误。
默认参数
如果我们想要一个参数的默认值,我们使用argument \\ 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