声明一个局部函数。
[Modifiers] LOCAL FUNCTION <idFunction>
[Typeparameters]
[([<idParam> [AS | REF|OUT|IN <idType>] [, ...])]
[AS <idType>]
[TypeparameterConstraints]
[=> <expression>]
CRLF
[<Body>]
END FUNCTION
[Modifiers] | 局部函数的唯一有效修饰符是 UNSAFE 和/或 ASYNC |
<idFunction> | 函数的有效标识符名称。 函数是一个实体,因此与其他实体共享相同的名称空间。 这意味着不可能出现函数和类同名的情况。 |
TypeParameters | 这适用于具有泛型类型参数的方法。这类似于 <T>,用于具有一个名为 T 的类型参数的方法。通常,参数列表中的一个参数也是类型 T。 |
<idParam> | 参数变量。 以这种方式指定的变量会自动声明为局部变量。 这些变量也称为形参(形式参数),用于接收调用实体时传递的参数。 |
AS | REF | OUT | IN <idType> | 指定参数变量的数据类型(称为强类型)。 AS 表示参数必须通过值传递,REF 表示参数必须通过带 @ 操作符的引用传递。OUT 是一种特殊的 REF 参数,不必在调用前赋值,必须在实体内部赋值。IN 参数作为 READONLY 引用传递。 |
列表中的最后一个参数也可以声明为 PARAMS <idType>[] ,这将告诉编译器函数/方法可以接收零个或多个可选参数。 |
使用 CLIPPER 调用约定的函数或方法将被编译为一个带有单个参数的函数,该参数被声明为 Args PARAMS USUAL[] 。 |
AS <idType> | 指定数据类型。如果省略,编译器依据编译选项来决定数据类型,或者是 USUAL,或者是由编译器自行决定。 |
TypeParameterConstraints | 在这里,您可以为类型参数指定约束,例如 WHERE T IS SomeName 或 WHERE T IS New。 |
=> <Expression> | 替代实体多行正文(body)的单一表达式。不能与正文(body)一起编译 |
<Body> | 构成此主体代码的程序语句。 |
<Body> 可以包含一个或多个 RETURN 语句,以将控制权返回给调用例程,并作为函数的返回值。如果未指定 RETURN 语句,当函数定义结束时,控制权将返回给调用例程,并且函数将根据指定的返回值数据类型返回一个默认值(如果返回值没有强类型,则返回 NIL)。 |
不能与表达式主体(Expression Body)结合使用。 |
END FUNCTION | 强制性关键字表示函数的逻辑终点。 |
局部函数被定义为一个包含成员的嵌套函数。END FUNCTION 是必须的,这样编译器才能知道函数在哪里结束,其周围的容器在哪里继续。
在下面的示例中,WAIT 命令是 Start() 函数的一部分,将在显示对 Fact() 的调用结果后执行。
FUNCTION Start AS VOID
? Fact(10)
LOCAL FUNCTION Fact(nNum AS LONG) AS LONG
IF nNum == 1
RETURN 1
ENDIF
RETURN nNum * Fact(nNum-1)
END FUNCTION
WAIT
RETURN
FIELD, LOCAL, MEMVAR, METHOD, PROCEDURE, RETURN, FUNCTION