什么是使用捕获语法传递的内核函数?

What is a Kernel function passed using capture syntax?

我正在尝试了解 Elixir 和 Kernel。 + / 2 函数有效,有人可以用一些用法示例来解释吗?我试图理解以下函数,但我不清楚。

def multiple_three_five do
    1..999
    |> Enum.filter(fn(n) -> rem(n, 3) == 0 or rem(n, 5) == 0 end)
    |> Enum.reduce(&Kernel.+/2)
    |> IO.puts
  end

如果您在 IEx,您可以使用 h 回调来显示模块或函数等的文档。试一试,很有帮助!

即:

iex(1)> h Kernel.+
# the documentation will be displayed here

除了文档中已有的内容外,没有太多要添加的内容。基本上,Kernel.+/2 用于将两个数字相加。

您可以这样调用 Kernel.+/2 函数:

1 + 1

如果你觉得更花哨,也可以点赞:

Kernel.+(1, 1)

除了@ryanzidago的回答,语法&<module>.<function>/<arity>是将命名函数转换为匿名函数。 Arity 代表函数可以采用的参数数量。此功能通常被称为“捕获”,我不太明白为什么这样命名。

例如,

&String.to_integer/1

工作方式相同
fn str ->
  String.to_integer(str)
end

可能会快一点。

&Kernel.+/2

工作方式相同
fn a, b ->
  Kernel.+(a, b)
end

fn a, b -> a + b end

顺便说一句,如果命名函数(public或不在当前模块中),您可以省略<module>.部分。