跳到主要内容
版本:release

类型表示

语法

  • 基本类型1 ??
  • 标识符 ??
  • enum (标识符 .)? 标识符 ??
  • class (标识符 .)? 标识符

注释:

  1. 基本类型如下:
  • 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 类型声明, enumclassdelegate),可以使用一个与类型名相同的 标识符 来指代该类型;也可以在类型前标注 enumclass 关键字以帮助编译器消除语法的歧义,在声明变量时,两种形式均可使用:

enum Color
{
R,
G,
B,
}
class Person
{
string name;
int age;
}

Color a;
enum Color b;

Person p;
class Person q;

类型转换表达式 中,必须使用 enumclass 标注用户声明的类型:

(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();

需要注意的是,声明变量时,需要在 脚本名.类型名 前加上 classenum 关键字以消除语法的歧义。

如果被引用的类型是一个 export enum,可以省略脚本名直接使用类型名:

import Example;
// 假设 Example.gs 中定义了 export enum Color {...}

enum Example.Color c1 = Example.Color.RED_;
Color c2 = Color.GREEN; // Ok, Color 是 export enum,可以省略脚本名

如果被引用的类型是一个 classdelegate,在类型名不冲突的情况下,也可以省略脚本名直接使用类型名:

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 实例的信息