函数
2024年12月22日大约 3 分钟
函数
概述
在阅读函数文档时,你应该了解函数声明定义、传参机制。
本站函数名结尾带*
的函数表示:
- 暂不了解的作用的函数
- 表示一系列函数,即它还存在类似的函数
相关信息
M中存在一些函数或类型不会对普通用户开放,还有部分函数虽然暴露给了用户,但你无法使用。如果函数说明中标记“仅内部使用”,则表示该部分内容普通用户无法使用,通常是给普通开发者或微软内部开发者使用。
函数定义
函数包含两大部分:参数列表和函数体,即:(
参数列表)
返回类型=>
函数体,参数列表和返回类型不是必需的。
- 参数列表:使用逗号分隔的若干个参数,它们形如
[optional] 标识符 [as 类型名称]
([]
表示可选)。 - 返回类型:指定函数返回的类型。
- 函数体:函数的主体部分,也就是计算部分。
函数的参数列表可以没有参数,也可以使用optional
标记某个参数为可选的,但带optional
的可选参数必须在最后。常规定义如下:
(x, optional y) => x + y
函数定义时如果不指定参数类型和返回类型(即上面的定义方式),那么将默认为any
类型,即可以接受和返回任何类型的值,因此上面定义的完整形式是:
(x as any, optional y as any) as any => x + y
下面是一些定义和解释:
// 无参数函数
() => 666
// 包含一个参数,参数和返回值可以是任何类型
(a) => 666
(a as any) as any => a is number
// 参数a是数字类型,b是可选的文本类型,函数必须返回文本
(a as number, optional b as text) as text => Text.From(a) & (b ?? "")
each语法
如果函数只有一个参数,还可以使用each
来简化定义。
(x) => x + 5
上面的定义等价于:
each _ + 5
警告
each
无法指定参数和返回值的类型,始终是可以输入和返回所有类型的值。- 上面两种方式是等价的,只是因为它们的定义简单。实际使用中由于复杂的函数嵌套,类似的定义可能会有不同。
隐式传参
很多函数要求用户输入一个函数作为参数,常见的是表函数和列表函数。在表函数中,如果不需要指定列名,那么内部函数的参数是表行,否则是具体列的值。比如下面的函数:
Table.AddColumn(
table as table,
newColumnName as text,
columnGenerator as function,
optional columnType as nullable type
) as table
在该函数中,函数并未要求用户输入表中已有的列名,因此参数columnGenerator
会被传入表行(记录值),所以你的应该定义一个对应的函数,比如:
(r) => r[a列] + 100
当然,在实际使用时,为了简单,更多是使用下面的形式,如果没有其它函数嵌套的话,它们具有相同的含义:
each [a列] + 100