Что означает «& 1» в функции эликсира? - PullRequest
1 голос
/ 08 марта 2019

С учетом этой функции, что означает &1?

Enum.map [1, 2, 3, 4], &(&1 * 2)

Ответы [ 2 ]

4 голосов
/ 08 марта 2019

&1 относится к первому аргументу, который получит функция обратного вызова.Сам по себе амперсанд (&) является сокращением для захваченной функции.Вот как можно расширить эту функцию.

Enum.map([1, 2, 3, 4], fn x -> x * 2 end)

fn -> равно &(...

x -> x равно ...(&1

БыстрыйСсылка может быть найдена здесь

1 голос
/ 11 марта 2019

Синтаксис &(1 + &1) в эликсире - это просто еще один способ написать анонимную функцию .

Итак, учитывая вышеизложенное:

fn(x) -> 1 + x end

Идентично

&(1 + &1)

Это просто еще один способ написания анонимных функций, обычно используемый, когда вы выполняете небольшую единицу операции или просто вызываете другую функцию.

Каждый &n при использовании этого синтаксиса относится к позиции аргументов, вызываемых в этой функции.

Итак:

fn(x, y, z) -> x + y + z end

Это означало бы, что если бы вы использовали сокращение &, синтаксис анонимной функции:

  • x == &1 потому что x является первым аргументом
  • y == &2 потому что y является вторым аргументом
  • z == &3 потому что z - третий аргумент

Другим способом представления этих аргументов является использование синтаксиса анонимной функции + arity, который в значительной степени действует как делегатор.

Например, предположим, что вы хотите отобразить список значений и применить функцию к каждому значению. Используя основной синтаксис анонимной функции, он будет выглядеть так:

Enum.map([1, 2, 3], fn(x) -> add_one(x) end)

Использование & с захватом аргументов (&1)

Enum.map([1, 2, 3], &(add_one(&1))

Использование & с сопоставлением арности:

Enum.map([1, 2, 3], &add_one/1)

Это просто говорит о том, что эта анонимная функция будет принимать только 1 аргумент, и этот аргумент следует применять к функции с именем add_one, которая также является функцией 1 арности.

Таким образом, эти три примера выше одинаковы и все приведут к вызову add_one для каждого аргумента.

...