委托声明
语法
- delegate 类型 标识符 ( 形参声明列表1? )
注释:
-
形参声明列表的语法如下:
- ...?
- 形参声明2 (, 形参声明)* (, ...)?
-
形参声明的语法如下:
- 类型 标识符
描述
委托声明用于声明一个委托类型,委托类型是一种特殊的 function 类型。委托类型的实例可以存储对特定函数的引用,
并且可以像调用普通函数一样调用该实例。
delegate int MyDelegate(int a, int b);
function f = (int x, int y) { return x + y; };
MyDelegate d = f;
int result = d.call(10, 20); // 调用委托实例,result 的值为 30
委托类型的实例可以存储对任何与其签名匹配的函数的引用,包括具名函数和匿名函数,只要其实际接受的参数类型和返回类型与委托类型 声明时指定的类型一致即可。
delegate float MathOp(float x, float y);
function add = (float a, float b, float c) { return a + b + c; };
// MathOp op = add; // 错误,参数数量不匹配
add.append_arg(0.0); // 为 add 函数追加一个默认参数
MathOp op = add; // 正确,参数数量和类型匹配
float result = op.call(1.0, 2.0); // 调用委托实例,result 的值为 3.0
writeln(result);
对委托类型的类型检查将在编译期/运行时检查,对于不匹配的类型,将在编译期或运行时产生错误。
在一个脚本中声明的委托类型,可以通过导入该脚本,在其他脚本中使用该委托类型。
import Example;
// 假设 Example.gs 中声明了 delegate string MyDelegate(string name, int age);
MyDelegate d = (string n, int a) {
return "Name: " + n + ", Age: " + a;
};
示例
delegate string StringFormatter(string name, int age);
function format = (string n, int a) {
return "Name: " + n + ", Age: " + a;
};
StringFormatter formatter = format;
writeln(formatter.call("Alice", 30)); // 输出 "Name: Alice, Age: 30"