Основные сведения о функциях Power Query M
В языке формул Power Query M функция — это сопоставление набора входных значений с одним выходным значением. Для создания функции нужно указать ее параметры, а затем выражение для вычисления ее результата. Тело функции следует за символом перехода (=>). При необходимости сведения о типе можно включить в параметры и возвращаемое значение функции. Функция определяется и вызывается в теле оператора let. Параметры и (или) возвращаемое значение могут быть неявными или явными. Неявные параметры и (или) возвращаемое значение имеют тип any. Тип any похож на тип object в других языках. Все типы в M являются производными от типа any.
Функция — это значение, аналогичное числу или текстовому значению, которое можно включить в строку так же, как и любое другое выражение. В следующем примере показана функция, являющаяся значением переменной Add, которая затем вызывается или выполняется из нескольких других переменных. При вызове функции указывается набор значений, которые логически подставляются для требуемого набора входных значений в выражении тела функции.
Пример: явные параметры и возвращаемое значение
let
AddOne = (x as number) as number => x + 1,
//additional expression steps
CalcAddOne = AddOne(5)
in
CalcAddOne
Пример: неявные параметры и возвращаемое значение
let
Add = (x, y) => x + y,
AddResults =
[
OnePlusOne = Add(1, 1), // equals 2
OnePlusTwo = Add(1, 2) // equals 3
]
in
AddResults
Поиск первого элемента больше 5 в списке или вывод значения NULL
let
FirstGreaterThan5 = (list) =>
let
GreaterThan5 = List.Select(list, (n) => n> 5),
First = List.First(GreaterThan5)
in
First,
Results =
[
Found = FirstGreaterThan5({3,7,9}), // equals 7
NotFound = FirstGreaterThan5({1,3,4}) // equals null
]
in
Results
Функции можно использовать рекурсивно. Чтобы рекурсивно сослаться на функцию, добавьте в идентификатор префикс @.
let
fact = (num) => if num = 0 then 1 else num * @fact (num-1)
in
fact(5) // equals 120
Ключевое слово each
Ключевое слово each используется для удобного создания простых функций. "each ..." — это синтаксический сахар для сигнатуры функции, которая принимает параметр "(_) => ...".
Ключевое слово each удобно использовать совместно с оператором подстановки, который по умолчанию применяется к _.
Например, запись each [CustomerID], аналогичная записи each _[CustomerID], которая аналогичная записи (_) => _[CustomerID].
Пример: использование each в фильтре строк таблицы
Table.SelectRows(
Table.FromRecords({
[CustomerID = 1, Name = "Bob", Phone = "123-4567"],
[CustomerID = 2, Name = "Jim", Phone = "987-6543"] ,
[CustomerID = 3, Name = "Paul", Phone = "543-7890"] ,
[CustomerID = 4, Name = "Ringo", Phone = "232-1550"]
}),
each [CustomerID] = 2
)[Name]
// equals "Jim"