跳到主要内容
版本:master

(具名)函数声明

语法

  • (public|protected|private)? (virtual|final|override|static|inline|noinline)* parallel? 类型 函数声明原型1 ( 形参声明列表2 ) { 语句列表 }

注释:

  1. 支持如下形式的函数原型:

    形式语法说明
    1标识符普通函数
    2组件名 . 标识符覆写组件中的虚函数
    3类型 . 标识符为指定类型拓展函数
  2. 形参声明列表的语法如下:

    • ...?
    • 形参声明3 (, 形参声明)* (, ...)?
  3. 形参声明的语法如下:

描述

函数声明用于声明一个具名的函数,具名函数声明可以为 class 提供方法,或者为脚本提供 成员函数(形式 1)。

如果需要覆写组件中的 虚函数,可以使用形式 2 的函数原型进行声明。

也可以按照形式 3中的原型,为一个指定类型添加拓展函数。

函数可以使用多种修饰符来描述函数的行为或特性:

访问控制

函数可以使用 publicprotectedprivate 访问修饰符来控制其可见性:

  • public: 函数可以被任何地方调用
  • protected: 这个函数只能被子类(如果修饰的是 class 方法)或 组合 此脚本的其 他脚本中调用
  • private: 这个函数只能在当前类(如果修饰的是 class 方法)或当前脚本中调用

如果函数是 class 的方法,函数的默认访问权限是 public;否则,默认权限是 private

函数修饰符

函数支持多种修饰符来控制其行为:

  • virtual: 声明虚函数,允许被重写;class 的方法不能使用此修饰符修饰
  • final: 最终覆写说明,用于覆写组件中的虚函数,同时禁止继续被覆写
  • override: 覆写说明,用于覆写组件中的虚函数,可以继续被覆写
  • static: 声明静态函数,可以修饰 class 方法或类型拓展函数
  • inline: 声明内联函数,强制编译器进行内联优化,如果编译器无法内联该函数,在编译期报错
  • noinline: 声明非内联函数,禁止编译器进行内联优化

如果使用 finaloverride 修饰符,函数原型应当使用形式 2 的函数原型,以说明被覆写的函数来自何处。

如果一个 class 的方法被 static 修饰,则该方法不要求接收 self 参数,具体规则参见 这里

函数原型

函数声明支持三种形式的函数原型:

  1. 普通函数: 直接使用标识符作为函数名
  2. 覆写函数: 使用 组件名.标识符 的形式,覆写组件中的虚函数
  3. 拓展函数: 使用 类型.标识符 的形式,为指定类型添加扩展方法
// 普通函数
int calculate(int x, int y) {
return x * y;
}

// 覆写函数
override void ComponentBase.on_event(int event_id) {
writeln("Event received: ", event_id);
}

// 拓展函数
int string.length() {
return this.size();
}

形参

函数可以声明形参,在函数被调用时,实参会传递给形参。支持默认参数,在声明形参时,在形参的变量名后跟随 = 常量表达式,即可 为该形参指定默认值;形参的默认值必须是常量。

带有默认值的形参必须放在参数列表的末尾。

如果形参的类型是 引用容器类型,此时允许使用 parallelreadonly 修饰该形参的类型,表示传入的实参必须 是严格对应 parallel 或 readonly 的。

可变参数

函数支持可变参数,使用 ... 语法声明。可变参数必须放在参数列表的末尾。

int sum(int first, ...) {
int total = first;
for (int i = 1; i < arg_count(); i++) {
total += arg(i);
}
return total;
}

writeln(sum(1, 2, 3, 4)); // 输出 10

parallel 函数

对象的成员函数可以被 parallel 修饰,如果这么做,该函数成为 parallel 函数。调用该函数时, 协程不必切入对象的域。

parallel 函数只能访问对象的 非 RW 成员

class 的成员方法不需要使用 parallel 修饰,任何 class 方法都被视为 parallel 方法。

示例

void greet(string name, string greeting = "Hello") {
writeln(greeting + ", " + name + "!");
}

greet("Alice"); // 输出 "Hello, Alice!"
greet("Bob", "Hi"); // 输出 "Hi, Bob!"

// 静态函数示例
class MathUtils {
public static int max(int a, int b) {
return a > b ? a : b;
}
}

writeln(MathUtils.max(5, 8)); // 输出 8