(具名)函数声明
语法
- (public|protected|private)? (virtual|final|override|static|inline|noinline)* parallel? 类型 函数声明原型1 ( 形参声明列表2 ) { 语句列表 }
注释:
-
支持如下形式的函数原型:
形式 语法 说明 1 标识符 普通函数 2 组件名 . 标识符 覆写组件中的虚函数 3 类型 . 标识符 为指定类型拓展函数 -
形参声明列表的语法如下:
- ...?
- 形参声明3 (, 形参声明)* (, ...)?
-
形参声明的语法如下:
描述
函数声明用于声明一个具名的函数,具名函数声明可以为 class 提供方法,或者为脚本提供 成员函数(形式 1)。
如果需要覆写组件中的 虚函数,可以使用形式 2 的函数原型进行声明。
也可以按照形式 3中的原型,为一个指定类型添加拓展函数。
函数可以使用多种修饰符来描述函数的行为或特性:
访问控制
函数可以使用 public、protected 或 private 访问修饰符来控制其可见性:
public: 函数可以被任何地方调用protected: 这个函数只能被子类(如果修饰的是class方法)或 组合 此脚本的其 他脚本中调用private: 这个函数只能在当前类(如果修饰的是class方法)或当前脚本中调用
如果函数是 class 的方法,函数的默认访问权限是 public;否则,默认权限是 private。
函数修饰符
函数支持多种修饰符来控制其行为:
virtual: 声明虚函数,允许被重写;class的方法不能使用此修饰符修饰final: 最终覆写说明,用于覆写组件中的虚函数,同时禁止继续被覆写override: 覆写说明,用于覆写组件中的虚函数,可以继续被覆写static: 声明静态函数,可以修饰class方法或类型拓展函数inline: 声明内联函数,强制编译器进行内联优化,如果编译器无法内联该函数,在编译期报错noinline: 声明非内联函数,禁止编译器进行内联优化
如果使用 final 或 override 修饰符,函数原型应当使用形式 2 的函数原型,以说明被覆写的函数来自何处。
如果一个 class 的方法被 static 修饰,则该方法不要求接收 self 参数,具体规则参见 这里。
函数原型
函数声明支持三种形式的函数原型:
- 普通函数: 直接使用标识符作为函数名
- 覆写函数: 使用
组件名.标识符的形式,覆写组件中的虚函数 - 拓展函数: 使用
类型.标识符的形式,为指 定类型添加扩展方法
// 普通函数
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();
}
形参
函数可以声明形参,在函数被调用时,实参会传递给形参。支持默认参数,在声明形参时,在形参的变量名后跟随 = 常量表达式,即可
为该形参指定默认值;形参的 默认值必须是常量。
带有默认值的形参必须放在参数列表的末尾。
如果形参的类型是 引用容器类型,此时允许使用 parallel 或 readonly 修饰该形参的类型,表示传入的实参必须
是严格对应 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