Haxe 支持表达式中使用 类级 函数声明也支持 局部 函数声明。其语法遵循类字段方法(4.3)的语法:
Haxe supports first-class functions and allows declaring local functions in expressions. The syntax follows class field methods (4.3):
class Main {
static public function main() {
var value = 1;
function myLocalFunction(i) {
return value + i;
}
trace(myLocalFunction(2)); // 3
}
}
我们声明了一个 myLocalFunction
位于类字段 main
的块表达式(5.1)中。它接受一个参数,并对参数加上外部作用域中定义的 value
的值。
We declare myLocalFunction inside the block expression (5.1) of the main class field. It takes one argument i and adds it to value, which is defined in the outside scope.
其作用域等同于 变量(5.10)的作用域,且大多数情况下声明一个带命名的局部函数实际上可以被看作是把一个匿名函数赋值到一个变量上:
The scoping is equivalent to that of variables (5.10) and for the most part writing a named local function can be considered equal to assigning an unnamed local function to a local variable:
var myLocalFunction = function(a) { }
但是当涉及类型参数(3.2)以及函数所处位置时有些不同。当一个函数在声明时没有被赋值给任何变量,我们称它为 'lvalue' 函数,反之称其为 'rvalue' 函数
- lvalue 函数需要一个名字,且可以具有类型参数(3.2)
- rvalue 函数不一定有名字,但不可以具有类型参数
However, there are some differences related to type parameters and the position of the function. We speak of a “lvalue” function if it is not assigned to anything upon its declaration, and an “rvalue” function otherwise.
- Lvalue functions require a name and can have type parameters (3.2).
- Rvalue functions may have a name, but cannot have type parameters.
var func = function(){}; // 这是一个 rvalue 函数, 它有名字,可以通过 func 这个 “名字” 来调用它
function(){}; // 同样这也是一个 rvalue 函数,但是它没有名字,是个孤儿, 但是除非作为某个函数参数,否则单独这样放在某个语句块会报错。
function hasName <T> (){}; // 这是一个 lvalue 函数可以具有类型参数
var funFact = function gotNamed<T>(x:T){ trace('T is: ${x}'); }; // 这样的声明不可行,尽管 gotNamed 是 lvalue 但是编译器会认为 funFact 实际上是作为 rvalue 使用,所以编译器会抛出错误提示;所以其实这种写法并不能作为某个参数来传递
var funFact = hasName; // 但是这样可以, 此时相当于 lvalue 函数 hasName 的另外一个别名为 funFact 。。。