类型表示
语法
- 基本类型1 ??
- 标识符 ??
- enum (标识符 .)? 标识符 ??
- class (标识符 .)? 标识符
注释:
- 基本类型如下:
- mixed
- nil
- void
- int
- bool
- float
- raw_pointer
- string
- buffer
- function
- array
- map
- class_map
- handle
- object
- program
- domain
- timer
- ref_value
- share_value
- coroutine
- sync_object
- queue
- file
- sockaddr
- 其他不可用作值类型的类型(如
system.core等)
描述
在 GS 中,类型表示被用于多种语法语法结构中,用于指明某一语法元素所需要的类型说明 。
内置类型
编译器的词法分析阶段,当遇到与内置类型同名的 标识符 时,会将其视为内置类型。
用户声明类型
对于用户声明的类型 (FFI 类型声明, enum,
class 或 delegate),可以使用一个与类型名相同的 标识符 来指代该类型;也可以在类型前标注 enum
或 class 关键字以帮助编译器消除语法的歧义,在声明变量时,两种形式均可使用:
enum Color
{
R,
G,
B,
}
class Person
{
string name;
int age;
}
Color a;
enum Color b;
Person p;
class Person q;
在 类型转换表达式 中,必须使用 enum 或 class 标注用户声明的类型:
(enum Color)some_value;
(class Person)another_value;
(int)val; // Ok, 内置类型可以被直接用于类型转换
(enum Color)val; // Ok, 使用 enum 标注用户声明的类型
// (Color)val; // Error, 必须使用 enum 标注
位于其他脚本中的用户声明类型
当需要引用一个来自其他脚本中定义的类型时,可以使用 脚本名.类型名 的形式来表示该类型:
import Example;
// 假设 Example.gs 中定义了 class SomeClass {...}
class Example.SomeClass c = Example.SomeClass.new();
需要注意的是,声明变量时,需要在 脚本名.类型名 前加上 class 或 enum 关键字以消除语法的歧义。
如果被引用的类型是一个 export enum,可以省略脚本名直接使用类型名:
import Example;
// 假设 Example.gs 中定义了 export enum Color {...}
enum Example.Color c1 = Example.Color.RED_;
Color c2 = Color.GREEN; // Ok, Color 是 export enum,可以省略脚本名
如果被引用的类型是一个 class 或 delegate,在类型名不冲突的情况下,也可以省略脚本名直接使用类型名:
import Example;
// 假设 Example.gs 中定义了 class Person {... 和 delegate MyDelegate(...) {...}
Person p2 = Person.new(); // Ok
MyDelegate d1 = (){}; // Ok
可空类型
在类型表示后面添加 ? 符号,可以将该类型表示为一个 可空类型,表示该类型的值亦可能为 nil。
int? a = nil; // Ok
// int b = nil; // Error, 非可空类型不能赋值为 nil
只有本身不可为空的类型可以被标注为可空类型:
int? a = 10; // Ok
// string? b = "Hello"; // Error, string 类型本身是可空的,不能再标注为可空类型
示例
import Example;
// 假设 Example.gs 中定义了 enum Color {...} 和 class Person {...
Color? favoriteColor = nil; // 可空的枚举类型
class Example.Person p = nil;
writeln(favoriteColor); // 输出 nil
writeln(p); // 输出 nil
favoriteColor = Example.Color.RED_;
p = Example.Person.new();
writeln(favoriteColor); // 输出 Color.RED_
writeln(p); // 输出 Person 实例的信息