跳到主要内容
版本:master

委托声明

语法

  • delegate 类型 标识符 ( 形参声明列表1? )

注释:

  1. 形参声明列表的语法如下:

    • ...?
    • 形参声明2 (, 形参声明)* (, ...)?
  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"